Java Splitter 示例 - Java 中的拆分器

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(374)   2023-06-26 07:54:18

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

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

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

Java 集合类提供 default stream()parallelStream() 方法,它们通过调用在内部使用 Spliterator到拆分器()。它有助于并行处理收集数据。

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

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

1. Java Spliterator 特性

以下是 Spliterator 在 Java 中提供的功能列表。

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

2. Java 拆分器方法

  1. int characteristics() :返回拆分器的特征列表。它可以是 ORDERED、DISTINCT、SORTED、SIZED、NONNULL、IMMUTABLE、CONCURRENT 和 SUBSIZED 中的任何一个。
  2. long estimateSize() :返回 forEachRemaining() 遍历将遇到的元素数量的估计值,或者如果无限、未知或计算成本太高则返回 Long.MAX_VALUE。
  3. default void forEachRemaining(Consumer action):在当前线程中按顺序对每个剩余元素执行给定操作,直到处理完所有元素或操作引发异常。
  4. 默认比较器 getComparator():如果拆分器的源由比较器排序,则返回该比较器。
  5. default long getExactSizeIfKnown():如果此 Spliterator 为 SIZED,则返回 estimateSize(),否则返回 -1。
  6. default boolean hasCharacteristics(int characteristics):如果 dpliterator 的 characteristic() 包含所有给定的特征,则返回 true。
  7. boolean tryAdvance(Consumer action) :如果存在剩余元素,则对其执行给定的操作,返回 true;否则返回 false
  8. Spliterator trySplit():如果 spliterator 可以分区,则返回一个 Spliterator 覆盖元素,从该方法返回时,该 Spliterator 将不被该 Spliterator 覆盖。

3. Java 拆分器示例

3.1. Spliterator characteristics() 示例

验证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 示例,即拆分器要迭代的元素数。

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() 示例

用于查找 spliterator 使用的比较器的 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.拆分器 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 文档

地址:https://www.cundage.com/article/java-spliterator.html

相关阅读

Java Iterator 接口用于迭代 Collection 的元素(List、Set 或 地图)。 Iterator 有助于从指定集合中逐个检索元素,并可选择对每个元素执行操作。 Java ...
下面的示例使用不同的技术来迭代 java 集合。在任何情况下都选择使用适合您且方便的方式。 Iterable.forEach 方法(Java 8) 最近在 java 8 中引入,此方法可以在任何...
很多时候您会在面试 中被问到这个问题。例如Iterator 如何在 java 中工作,它如何从 List 中删除对象?从列表中删除对象时,什么时候可能会产生ConcurrentModificat...
Java LinkedHashSet 类扩展了 HashSet 并实现了 Set 接口。它与 HashSet 类非常相似,除非提供可预测的迭代顺序&lt; /strong&gtl;。 1. Li...
Java Spliterator 接口是一个内部迭代器,它将流 分成更小的部分。这些较小的零件可以并行处理。 在实际编程中,我们可能永远不需要直接使用Spliterator。在正常操作下,它的行...
Java forEach() 方法是一个实用函数,用于迭代集合,例如(List、Collect或Map)和 Stream。它用于对集合中的每个元素执行给定的操作。 forEach() 方法已添加...
Java Stream 收集教程展示了如何使用收集器进行缩减操作。 Java流 Java 流 是来自支持聚合操作的源的元素序列。流不存储元素;元素是按需计算的。从集合、数组或 I/O 资源等数据...
ArrayList 是非同步 集合,不应在并发中使用a&gtl; 没有显式同步的环境。要同步ArrayList,我们可以使用JDK 提供的两个方法。 Collections.synchroniz...
在 Java 中迭代列表是非常基本的操作,但多年来它经历了一些重大变化。我们将在给定的示例中介绍所有这些更改。为简单起见,我创建了一个简单的 String 列表,如下所示: List&lt;St...
Java CopyOnWriteArrayList 是线程安全 &lt; strong&gtl;ArrayList,其中所有可变操作(添加、设置等)都是通过制作底层 数组。 它是不可变快照风格的...