问题描述
我想知道为什么我们将某些收集者归类为“下游”?那有上游收集器吗?请注意,这与用法无关,而是试图理解术语“下游”的逻辑。对我来说,当您通常处理流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.stream
,IntStream.range
,Stream.of
等),然后通过中间方法将原料转化(map
/ flatMap
等)并进行过滤(filter
/ limit
等),最后到达行尾,将它们组装成一个最终产品(collect
) * / sup>。
Collector
是构建上述不同最终产品的“机器”。 toList
建立一个列表。 toSet
建立了Set
等。但是,其他收集者并没有完全完成大事,例如groupingBy
。 groupingBy
仅用一把钥匙将物料分组,然后再次将物料以组的形式吐出到传送带上。这些收集者需要在生产线下游(又称为下游)的另一个收集者来继续生产最终产品。
mapping
是其中一个没有完全构建最终产品的收集器。它只是变换材质并再次将其吐出,类似于map
。它的用处在您需要时,例如转换从groupingBy
吐出的组。即当您将其用作另一个收集器的下游时,它最有用。
那么有上游收集器吗?
按照生产线的类比,这种关系是两种方式:toList
是mapping
的下游,所以mapping
是toList
的上游。在官方文档中。这个词没有被提及太多。我只在peek
中找到它。
*还有其他终端操作,但我们重点关注collect
,因为这是问题所在。