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
提供的特性列表。
- 在 Java 8 中引入了分离器。
- 它为任何集合的元素流的并行处理提供支持。
- 它提供
tryAdvance()
方法来分别迭代不同线程中的元素。 它有助于并行处理。 - 要在单个线程中顺序迭代元素,请使用
forEachRemaining()
方法。 - 如果可能,使用
trySplit()
方法对分割器进行分区。 - 它有助于将
hasNext()
和next()
操作组合为一种方法。
2. Java Spliterator
方法
int features()
:返回分离器的特性列表。 它可以是ORDERED
,DISTINCT
,SORTED
,SIZED
,NONNULL
,IMMUTABLE
,CONCURRENT
和SUBSIZED
中的任何一个。long EstimateSize()
:返回forEachRemaining()
遍历将遇到的元素数量的估计值;如果无限,未知或计算成本太高,则返回Long.MAX_VALUE
。default void forEachRemaining(Consumer action)
:依次对当前线程中的每个剩余元素执行给定的操作,直到所有元素都已处理或该动作引发异常。default comparator getComparator()
:如果分离器的源由比较器排序,则返回该比较器。default long getExactSizeIfKnown()
:如果此分离器为SIZED
,则返回estimateSize()
,否则为 -1。default boolean hasCharacteristics(int features)
:如果spliterator
的features()
包含所有给定的特征,则返回true
。boolean tryAdvance(Consumer action)
:如果存在剩余元素,则对其执行给定操作,并返回true
; 否则返回false
。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
中的其他有用方法分开。
将我的问题放在评论部分。
学习愉快!
参考文献: