如何确定流中各种功能的输入值

时间:2018-09-18 14:39:24

标签: java java-8 java-stream collectors

这个问题对于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));

1 个答案:

答案 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)的实现。