Java Spliterator 的特性

  • Spliterator 已在 Java 8 中引入。
  • 它为任何集合的元素流的并行处理提供支持。
  • 它提供了 tryAdvance() 方法来在不同的线程中单独迭代元素。它有助于并行处理。
  • 要在单个线程中按顺序迭代元素,请使用 forEachRemaining() 方法。
  • 如果可能,trySplit() 方法用于对拆分器进行分区。
  • 它有助于将 hasNext()next()操作组合成一个方法。
Java Spliterator

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