我在学习时了解到并行性
是Spliterator
的主要优点。
这可能是一个基本问题,但有人可以向我解释一下 Iterator
和 Spliterator
之间的主要区别并给出一些例子吗?
最佳答案
迭代器
是一系列可以迭代的元素的简单表示。
例如:
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/