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

问题描述 投票:3回答:1

这个问题我对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));
java java-8 java-stream collectors
1个回答
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));

使用来自grouping的返回类型为Collector<BlogPost, ?, Map<BlogPostType, List<BlogPOst>>>,你可以进一步收集postPerType,这要归功于Stream的收集实现,它具有签名<R, A> R collect(Collector<? super T, A,R> collector)

© www.soinside.com 2019 - 2024. All rights reserved.