Java Spliterator接口

Java Spliterator接口

原文: https://howtodoinjava.com/java/collections/java-spliterator/

Java Spliterator接口是一个内部迭代器,可将分解为较小的部分。 这些较小的零件可以并行处理。

在实际编程中,我们可能永远不需要直接使用分离器。 在正常操作下,它的行为将与 Java 迭代器完全相同。

Spliterator<T> spliterator = list.spliterator();

Java 集合类提供默认的stream()parallelStream()方法,这些方法在内部通过调用splitter()来使用Spliterator()。 它有助于并行处理收集数据。

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

default Stream<E> parallelStream() {
    return StreamSupport.stream(spliterator(), true);
}

1. Java Spliterator特性

以下是 Java 中Spliterator提供的特性列表。

  1. Java 8 中引入了分离器。
  2. 它为任何集合的元素流的并行处理提供支持。
  3. 它提供tryAdvance()方法来分别迭代不同线程中的元素。 它有助于并行处理。
  4. 要在单个线程中顺序迭代元素,请使用 forEachRemaining()方法。
  5. 如果可能,使用trySplit()方法对分割器进行分区。
  6. 它有助于将hasNext()next()操作组合为一种方法。

2. Java Spliterator方法

  1. int features():返回分离器的特性列表。 它可以是ORDEREDDISTINCTSORTEDSIZEDNONNULLIMMUTABLECONCURRENTSUBSIZED中的任何一个。
  2. long EstimateSize():返回forEachRemaining()遍历将遇到的元素数量的估计值;如果无限,未知或计算成本太高,则返回Long.MAX_VALUE
  3. default void forEachRemaining(Consumer action):依次对当前线程中的每个剩余元素执行给定的操作,直到所有元素都已处理或该动作引发异常。
  4. default comparator getComparator():如果分离器的源由比较器排序,则返回该比较器。
  5. default long getExactSizeIfKnown():如果此分离器为SIZED,则返回estimateSize(),否则为 -1。
  6. default boolean hasCharacteristics(int features):如果spliteratorfeatures()包含所有给定的特征,则返回true
  7. boolean tryAdvance(Consumer action):如果存在剩余元素,则对其执行给定操作,并返回true; 否则返回false
  8. Spliterator trySplit():如果可以对分离器进行分区,则返回一个覆盖元素的Spliterator,从该方法返回后,该分离器将不覆盖该元素。

3. Java Spliterator示例

3.1 Spliterator特性示例

验证从ArrayList获得的Spliterator特性的 Java 示例。

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

3.2 Spliterator estimateSize()getExactSizeIfKnown()示例

Java 示例,用于获取支持集合的大小,即由 spliterator 迭代的元素数量。

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

3.3 Spliterator getComparator()示例

查找分配器使用的比较器的 Java 示例。

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

3.4 Spliterator trySplit()示例

Java 示例,将元素分为两组并独立进行迭代。

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

3.5 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

4。总结

在本教程中,我们学习了 Java Spliterator接口。 我们学习了Spliterator方法和一些简单示例,以遍历集合元素和流,这与Spliterator中的其他有用方法分开。

将我的问题放在评论部分。

学习愉快!

参考文献:

Spliterator接口 Java 文档