资源说明: Java 9 Stream Collectors 新增功能
Java 9 中的 Stream Collectors 新增了两个重要的功能:Collectors.filtering 和 Collectors.flatMapping。这两个功能都是在 Java 8 中引入的 Collectors 的基础上进行了扩展和改进的。
Collectors.filtering 方法
Collectors.filtering 方法类似于 Stream 的 filter() 方法,但两者的使用场景不同。Stream 的 filter() 方法是在 stream 链接方法中使用的,而 Collectors.filtering 方法被设计和 groupingBy 一起使用。Stream 的 filter() 方法首先过滤元素,然后再分组。被过滤的值被丢弃无法被追溯跟踪。如果需要跟踪需要先分组然后再过滤,这正是 Collectors.filtering 能做的。
Collectors.filtering 带函数参数用于过滤输入参数,然后收集过滤元素。例如:
@Test
public void givenList_whenSatifyPredicate_thenMapValueWithOccurences() {
List numbers = List.of(1, 2, 3, 5, 5);
Map result = numbers.stream()
.filter(val -> val > 3)
.collect(Collectors.groupingBy(i -> i, Collectors.counting()));
assertEquals(1, result.size());
result = numbers.stream()
.collect(Collectors.groupingBy(i -> i,
Collectors.filtering(val -> val > 3, Collectors.counting())));
assertEquals(4, result.size());
}
Collectors.flatMapping 方法
Collectors.flatMapping 方法类似于 Collectors.mapping 方法,但粒度更细。两者都带一个函数和一个收集器参数用于收集元素,但 flatMapping 函数接收元素流,然后通过收集器进行累积操作。
例如,我们可以使用 Collectors.flatMapping 方法来收集博客的作者名和评论:
class Blog {
private String authorName;
private List comments = new ArrayList<>();
public Blog(String authorName, String... comment) {
this.authorName = authorName;
comments.addAll(Arrays.asList(comment));
}
public String getAuthorName() {
return this.authorName;
}
public List getComments() {
return comments;
}
}
@Test
public void givenListOfBlogs_whenAuthorName_thenMapAuthorWithComments() {
Blog blog1 = new Blog("1", "Nice", "Very Nice");
Blog blog2 = new Blog("2", "Disappointing", "Ok", "Could be better");
List blogs = List.of(blog1, blog2);
Map>> authorComments1 = blogs.stream()
.collect(Collectors.groupingBy(Blog::getAuthorName,
Collectors.flatMapping(Blog::getComments, Collectors.toList())));
}
Java 9 中的 Stream Collectors 新增功能具有重要的实践价值,可以帮助开发者更方便地处理数据。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。