我想知道为什么我们将某些收藏家归类为“下游”?那么是否有上游收集器?请注意,这不是关于用法,而是试图理解术语“下游”背后的逻辑。对我来说,当您通常处理流 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
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,Collectors.toList()被视为下游。
文档中的术语下游是指一个收集器接受第二个收集器作为参数。该参数在接受它的收集器的下游(之后)应用。换句话说,下游收集器应用于上游收集器的结果。
在您的示例中,Collectors.toList位于Collectors.mapping.
我经常将流 API 想象为构建产品的生产线。有(从某处来原料ArrayList.stream,IntStream.range,Stream.of,等等),在传送带上,然后用中间方法,所述材料得到转化(map/flatMap等)和过滤(filter/limit等)和最终它们到达行末,其中它们组装成一个最终产品 ( collect) *。
Collectors 是制造上述不同最终产品的“机器”。toList建立一个列表。toSet构建一个Set等等。但是,其他收集器并没有完全构建大的东西,例如groupingBy. groupingBy只用钥匙将材料分组,然后再次将物品吐出,分组,回到传送带上。这些收集器需要另一个收集器沿着生产线(即下游)继续构建最终产品。
mapping是另一个没有完全构建最终产品的收藏家。它只是将材料转化并再次吐出,这有点像map。当您想要时,它很有用,例如转换从groupingBy. 即当您将其用作另一个收集器的下游时,它最有用。
那么是否有上游收集器?
以下生产线类推,这种关系是双向的:toList是的下游mapping,所以mapping是的上游toList。虽然在官方文档中。这个词很少被提及。我只在peek.
*还有其他终端操作,但让我们关注collect,因为这就是问题所在。
| 归档时间: |
|
| 查看次数: |
620 次 |
| 最近记录: |