了解 Java 8 中的拆分器、收集器和流

2022-08-31 07:41:15

我在理解Java 8中的Stream接口时遇到了麻烦,特别是当它与SpteratorCollerer接口有关时。我的问题是,我根本无法理解界面,因此,界面对我来说仍然有些晦涩难懂。SpliteratorCollectorStream

究竟什么是 a 和 a,我该如何使用它们?如果我愿意写我自己的或(可能在这个过程中写我自己的),我该怎么办,不该做什么?SpliteratorCollectorSpliteratorCollectorStream

我阅读了一些散布在网络上的示例,但是由于这里的所有内容仍然是新的并且可能会发生变化,因此示例和教程仍然非常稀疏。


答案 1

您几乎肯定永远不必作为用户处理;仅当您自己编写类型并打算优化其上的并行化操作时,才需要这样做。SpliteratorCollection

就其价值而言,a是一种以一种易于拆分集合部分的方式对集合的元素进行操作的方法,例如,因为您正在并行化并希望一个线程处理集合的一部分,一个线程处理另一个部分,等等。Spliterator

从本质上讲,您也不应该将类型的值保存到变量中。 有点像 ,因为它是一个一次性的对象,你几乎总是在流利的链中使用,就像Javadoc的例子一样:StreamStreamIterator

int sum = widgets.stream()
                  .filter(w -> w.getColor() == RED)
                  .mapToInt(w -> w.getWeight())
                  .sum();

Collector是“reduce”操作的最通用,最抽象的可能版本, la map/reduce;特别是,它需要支持并行化和最终确定步骤。的示例包括:Collector

  • 求和,例如Collectors.reducing(0, (x, y) -> x + y)
  • StringBuilder appending,例如Collector.of(StringBuilder::new, StringBuilder::append, StringBuilder::append, StringBuilder::toString)

答案 2

Spliterator基本上意味着“可拆分迭代器”。

单线程可以遍历/处理整个拆分器本身,但拆分器也有一个方法,该方法将“拆分”一个部分供其他人(通常是另一个线程)处理 - 使当前拆分器的工作量更少。trySplit()

Collector将函数(map-reduce 的名声)的规范与初始值和用于组合两个结果的函数组合在一起(从而可以合并 Spliterated 工作流的结果)。reduce

例如,最基本的收集器的初始 vaue 为 0,将一个整数添加到现有结果中,并通过添加两个结果来“合并”两个结果。从而对拆分的整数流求和。

看:


推荐