这个问题我对Java 8集合来说是一个非常原始的问题。
如何更好地理解Java 8如何在流处理中的各个阶段之间传递输入值。如果有文件清楚地解释这一点我很乐意通读,但我无法遇到任何问题。
例如,groupingBy接受一个名为分类器的函数,它接受T类型并转换为K类型。
static <T,K> Collector<T,?,Map<K,List<T>>>
groupingBy(Function<? super T,? extends K> classifier)
在下面的例子中,我们只传递类型K.目前还不清楚在流中何时会自动考虑输入值(类型T)?我怎样才能更好地理解这一点?
Map<BlogPostType, List<BlogPost>> postsPerType = posts.stream()
.collect(groupingBy(BlogPost::getType));
在下面的例子中,我们只传递类型K.目前还不清楚在流中何时会自动考虑输入值(类型T)?
Map<BlogPostType, List<BlogPost>> postsPerType = posts.stream()
.collect(Collectors.groupingBy(BlogPost::getType));
注意代码中的方法引用,它等同于函数接口Function<T,R>
,在代码中使用apply
表示为getType()
方法的唯一方法BlogPost
。
我怎样才能更好地理解这一点?
更好地理解代码的方法之一就是重写简化代码:
Function<? super BlogPost, ? extends BlogPostType> classifier = BlogPost::getType;
// ^^^__you can see the correlation with Collectors#groupingBy(classifier)
Map<BlogPostType, List<BlogPost>> postsPerType = posts.stream()
.collect(Collectors.groupingBy(classifier));
使用来自grouping的返回类型为Collector<BlogPost, ?, Map<BlogPostType, List<BlogPOst>>>
,你可以进一步收集postPerType,这要归功于Stream的收集实现,它具有签名<R, A>
R
collect(Collector<? super T, A,
R
> collector)
。