繁体   English   中英

为什么Java stream API中的某些Collectors叫做下游collector?

[英]Why is certain Collectors in Java stream API called downstream collector?

我想知道为什么我们将某些收藏家归类为“下游”? 那么有上游收集器吗? 请注意,这不是关于使用,而是试图理解术语“下游”背后的逻辑。 对我来说,当您通常处理 stream API 用法时,构建器链中的所有流看起来都只是下游。

List<String> list = List.of("AAA","B","CCCCC","DDD", "FFFFFF", "AAA");
List<Integer> res =
            list.stream()
                    .collect(
                            Collectors.mapping(s -> s.length(), // string -> int
                                Collectors.toList())); // downstreaming

在上面的代码中, Collectors.toList()被认为是下游。

文档中的术语下游是指一个收集器接受第二个收集器作为参数。 该参数应用于接受它的收集器的下游(之后)。 换句话说,下游收集器应用于上游收集器的结果。

在您的示例中, Collectors.toList位于Collectors.mapping的下游。

我经常把 stream API 想象成建立一个产品的生产线。 There are raw materials coming from somewhere ( ArrayList.stream , IntStream.range , Stream.of , whatever), on a conveyer belt, and then with intermediate methods, the materials get transformed ( map / flatMap etc) and filtered ( filter / limit等),最后它们到达生产线的末端,在那里它们被组装成一个最终产品( collect*

Collector是构建上述不同最终产品的“机器”。 toList构建一个列表。 toSet构建一个Set等。但是,其他收集器并没有完全构建大东西,例如groupingBy groupingBy仅通过键对材料进行分组,然后将项目再次作为组吐出,回到传送带上。 这些收集器需要另一个收集器在生产线下游(也就是下游)来继续构建最终产品。

mapping是另一个没有完全构建最终产品的收集器。 它只是将材料转换并再次吐出,有点像map 当您想要时,它很有用,例如转换从groupingBy吐出的组。 即当您将它用作另一个收集器的下游时,它最有用。

那么有上游收集器吗?

以生产线类比,关系是两种方式: toListmapping mapping toList的上游。 虽然在官方文档中。 这个词很少提及。 我只在peek中找到它。

*还有其他终端操作,但让我们关注collect ,因为这就是问题所在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM