parallel-processing - Java8中Iterator和Spliterator的区别

标签 parallel-processing java-8 iterator spliterator

我在学习时了解到并行性Spliterator的主要优点。

这可能是一个基本问题,但有人可以向我解释一下 IteratorSpliterator 之间的主要区别并给出一些例子吗?

最佳答案

迭代器是一系列可以迭代的元素的简单表示。

例如:

 List<String> list = Arrays.asList("Apple", "Banana", "Orange");
 Iterator<String> i = list.iterator();
 i.next();
 i.forEachRemaining(System.out::println);

#output
Banana
Orange

Spliterator 可用于将给定的元素集拆分为多个集合,以便我们可以在不同线程中独立地对每个集合执行某种操作/计算,可能会利用并行性。它被设计为迭代器的并行类似物。除了集合之外,Spliterator 所涵盖的元素源还可以是数组、IO channel 或生成器函数等。

Spliterator 接口(interface)中有 2 个主要方法。

- tryAdvance() 和 forEachRemaining()

通过tryAdvance(),我们可以一一遍历底层元素(就像Iterator.next()一样)。如果存在剩余元素,则此方法对其执行消费者操作,返回 true;否则返回 false。

对于顺序批量遍历,我们可以使用 forEachRemaining():

 List<String> list = Arrays.asList("Apple", "Banana", "Orange");
 Spliterator<String> s = list.spliterator();
 s.tryAdvance(System.out::println);
 System.out.println(" --- bulk traversal");
 s.forEachRemaining(System.out::println);

 System.out.println(" --- attempting tryAdvance again");
 boolean b = s.tryAdvance(System.out::println);
 System.out.println("Element exists: "+b);

输出:

Apple
 --- bulk traversal
Banana
Orange
 --- attempting tryAdvance again
Element exists: false

- Spliterator trySplit()

将此分割器一分为二并返回新的:

  List<String> list = Arrays.asList("Apple", "Banana", "Orange");

  Spliterator<String> s = list.spliterator();
  Spliterator<String> s1 = s.trySplit();

  s.forEachRemaining(System.out::println);
  System.out.println("-- traversing the other half of the spliterator --- ");
  s1.forEachRemaining(System.out::println);

输出:

Banana
Orange
-- traversing the other half of the spliterator ---
Apple

理想的 trySplit 方法应该将其元素精确地分成两半,从而允许平衡的并行计算。

split 过程也称为“分区”或“分解”。

关于parallel-processing - Java8中Iterator和Spliterator的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51453841/

相关文章:

Python - 遍历嵌套列表时遇到问题

.net - 帮助我了解休眠线程的性能和行为

python - Python 中的多处理 : execute two functions at the exact same time

hadoop - hadoop FIFO调度是否不能使提交的作业并行运行?

java - 如何设置 IntelliJ IDEA 项目 SDK

javascript - Nashorn引擎中的.toLocaleString

java - map 值在数组中。所有值都需要转换为列表并将所有值组合为结果列表

java - 如何验证HashMap中的值是否存在

java - 如何使用迭代器进行替换和计数

parallel-processing - OpenMP PARALLEL DO 内的子例程 - 程序崩溃