Java Spliterator 的特性
- Spliterator 已在 Java 8 中引入。
- 它为任何集合的元素流的并行处理提供支持。
- 它提供了 tryAdvance() 方法来在不同的线程中单独迭代元素。它有助于并行处理。
- 要在单个线程中按顺序迭代元素,请使用 forEachRemaining() 方法。
- 如果可能,trySplit() 方法用于对拆分器进行分区。
- 它有助于将
hasNext()
和next()
操作组合成一个方法。
Java Spliterator 接口是一个内部迭代器,它将流分解为更小的部分。
这些小部分可以并行处理。
在正常操作下,它的行为与 Java Iterator 完全相同。
Spliterator<T> spliterator = list.spliterator();
Java 集合类提供默认的 stream() 和 parallelStream() 方法,它们通过调用 spliterator() 在内部使用 Spliterator。
它有助于并行处理收集数据。
default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); } default Stream<E> parallelStream() { return StreamSupport.stream(spliterator(), true); }
Java Spliterator 示例
Spliterator characteristics()示例
为ArrayList获得的Spliterator的特性。
ArrayList<String> list = new ArrayList<>(); Spliterator<String> spliterator = list.spliterator(); int expected = Spliterator.ORDERED | Spliterator.SIZED | Spliterator.SUBSIZED; System.out.println(spliterator.characteristics() == expected); //true if (spliterator.hasCharacteristics(Spliterator.ORDERED)) { System.out.println("ORDERED"); } if (spliterator.hasCharacteristics(Spliterator.DISTINCT)) { System.out.println("DISTINCT"); } if (spliterator.hasCharacteristics(Spliterator.SORTED)) { System.out.println("SORTED"); } if (spliterator.hasCharacteristics(Spliterator.SIZED)) { System.out.println("SIZED"); } if (spliterator.hasCharacteristics(Spliterator.CONCURRENT)) { System.out.println("CONCURRENT"); } if (spliterator.hasCharacteristics(Spliterator.IMMUTABLE)) { System.out.println("IMMUTABLE"); } if (spliterator.hasCharacteristics(Spliterator.NONNULL)) { System.out.println("NONNULL"); } if (spliterator.hasCharacteristics(Spliterator.SUBSIZED)) { System.out.println("SUBSIZED"); }
输出:
true ORDERED SIZED SUBSIZED
Spliterator estimateSize()和getExactSizeIfKnown()示例
获取支持集合大小
ArrayList<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); Spliterator<String> spliterator = list.spliterator(); System.out.println(spliterator.estimateSize()); System.out.println(spliterator.getExactSizeIfKnown());
输出:
4 4
Spliterator getComparator() 示例
SortedSet<String> set = new TreeSet<>( Collections.reverseOrder() ); set.add("A"); set.add("D"); set.add("C"); set.add("B"); System.out.println(set); System.out.println(set.spliterator().getComparator());
输出:
[D, C, B, A] java.util.Collections$ReverseComparator@7852e922
Spliterator trySplit() 示例
将元素拆分为两组并分别迭代
ArrayList<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); list.add("E"); list.add("F"); Spliterator<String> spliterator1 = list.spliterator(); Spliterator<String> spliterator2 = spliterator1.trySplit(); spliterator1.forEachRemaining(System.out::println); System.out.println("========"); spliterator2.forEachRemaining(System.out::println);
输出:
D E F ======== A B C
Spliterator forEachRemaining() 示例
使用 forEachRemaining() 方法在单个语句中执行 hasNext() 和 next() 操作的 Java 示例。
ArrayList<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); Spliterator<String> spliterator = list.spliterator(); spliterator.forEachRemaining(System.out::println);
输出:
A B C D
更多: zhilu jiaocheng
Java Spliterator 的方法
- int characteristics():返回拆分器的特性列表。它可以是 ORDERED、DISTINCT、SORTED、SIZED、NONNULL、IMMUTABLE、CONCURRENT 和 SUBSIZED 中的任何一个。
- longestimateSize() :返回对 forEachRemaining() 遍历将遇到的元素数量的估计,如果无限、未知或者计算成本太高,则返回 Long.MAX_VALUE。
- default void forEachRemaining(Consumer action) :在当前线程中按顺序对每个剩余元素执行给定的操作,直到所有元素都已处理或者操作引发异常。
- default Comparator getComparator() :如果拆分器的源由 Comparator 排序,则返回该 Comparator。
- default long getExactSizeIfKnown() :如果此 Spliterator 为 SIZED,则返回估计大小(),否则返回 -1.
- default boolean hasCharacteristics(int features) :如果 dpliterator 的 features() 包含所有给定的特征,则返回 true。
- boolean tryAdvance(Consumer action) : 如果存在剩余元素,则对其执行给定的操作,返回
true
;否则返回false
。 - Spliterator trySplit() :如果 spliterator 可以被分区,则返回一个 Spliterator 覆盖元素,当从这个方法返回时,它不会被这个 Spliterator 覆盖。
日期:2020-09-17 00:09:48 来源:oir作者:oir