为什么Java流API中的某些收集器称为下游收集器?

问题描述

我想知道为什么我们将某些收集者归类为“下游”?那有上游收集器吗?请注意,这与用法无关,而是试图理解术语“下游”的逻辑。对我来说,当您通常处理流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想象成构建产品的生产线。传送带上的原料来自某个地方(ArrayList.streamIntStream.rangeStream.of等),然后通过中间方法将原料转化(map / flatMap等)并进行过滤(filter / limit等),最后到达行尾,将它们组装成一个最终产品(collect) * / sup>。

Collector是构建上述不同最终产品的“机器”。 toList建立一个列表。 toSet建立了Set等。但是,其他收集者并没有完全完成大事,例如groupingBygroupingBy仅用一把钥匙将物料分组,然后再次将物料以组的形式吐出到传送带上。这些收集者需要在生产线下游(又称为下游)的另一个收集者来继续生产最终产品。

mapping是其中一个没有完全构建最终产品的收集器。它只是变换材质并再次将其吐出,类似于map。它的用处在您需要时,例如转换从groupingBy吐出的组。即当您将其用作另一个收集器的下游时,它最有用。

那么有上游收集器吗?

按照生产线的类比,这种关系是两种方式:toListmapping的下游,所以mappingtoList的上游。在官方文档中。这个词没有被提及太多。我只在peek中找到它。

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