这个问题对于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));
答案 0 :(得分:1)
在下面的示例中,我们仅传递类型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));
,其返回类型来自 groupingBy ,是 Collector<BlogPost, ?, Map<BlogPostType, List<BlogPOst>>>
,借助Stream的,您可以进一步收集 postPerType 收集具有签名<R, A>
R
collect(Collector<? super T, A,
R
> collector)
的实现。