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
