【问题标题】:How to ascertain input values to various functions in streams如何确定流中各种函数的输入值
【发布时间】:2018-09-18 14:39:23
【问题描述】:

这个问题对于 Java 8 集合来说是一个非常原始的问题。

如何更好地理解 Java 8 如何在流处理的各个阶段之间传递输入值。如果有文件清楚地解释这一点,我很乐意通读,但我找不到任何文件。

例如,groupingBy 接受一个称为分类器的Function,它接受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));

【问题讨论】:

  • 我已经给了answering this a try,但我不太确定我是否能够公正地解决这个问题。也许,你可以通过告诉我这是否有助于你更好地理解事情。

标签: java java-8 java-stream collectors


【解决方案1】:

在下面的例子中,我们只传递类型 K。不清楚 在流中时,输入值(类型 T)将自动 考虑?

Map<BlogPostType, List<BlogPost>> postsPerType = posts.stream()
            .collect(Collectors.groupingBy(BlogPost::getType));

注意代码中的方法引用,相当于函数接口Function&lt;T,R&gt; 在您的代码中,唯一的方法 apply 表示为来自 BlogPostgetType() 方法。

我怎样才能更好地理解这一点?

更好地理解代码的方法之一就是重写简化的代码:

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&lt;BlogPost, ?, Map&lt;BlogPostType, List&lt;BlogPOst&gt;&gt;&gt;,您可以通过 Stream 的 collectpostPerType /em> 具有签名&lt;R, A&gt; R collect(Collector&lt;? super T, A,R&gt; collector) 的实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多