多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Java `Spliterator`接口 > 原文: [https://howtodoinjava.com/java/collections/java-spliterator/](https://howtodoinjava.com/java/collections/java-spliterator/) Java `Spliterator`接口是一个内部迭代器,可将[流](https://howtodoinjava.com/java8/java-8-tutorial-streams-by-examples/)分解为较小的部分。 这些较小的零件可以并行处理。 在实际编程中,我们可能永远不需要直接使用**分离器**。 在正常操作下,它的行为将与 Java [**迭代器**](https://howtodoinjava.com/java/collections/java-iterator/)完全相同。 ```java Spliterator<T> spliterator = list.spliterator(); ``` Java 集合类提供默认的`stream()`和`parallelStream()`方法,这些方法在内部通过调用`splitter()`来使用`Spliterator()`。 它有助于并行处理收集数据。 ```java 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](https://howtodoinjava.com/java-8-tutorial/) 中引入了分离器。 2. 它为任何集合的元素流的并行处理提供支持。 3. 它提供`tryAdvance()`方法来分别迭代不同线程中的元素。 它有助于并行处理。 4. 要在单个线程中顺序迭代元素,请使用 `forEachRemaining()`方法。 5. 如果可能,使用`trySplit()`方法对分割器进行分区。 6. 它有助于将`hasNext()`和`next()`操作组合为一种方法。 ## 2\. Java `Spliterator`方法 1. **`int features()`**:返回分离器的特性列表。 它可以是`ORDERED`,`DISTINCT`,`SORTED`,`SIZED`,`NONNULL`,`IMMUTABLE`,`CONCURRENT`和`SUBSIZED`中的任何一个。 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)`**:如果`spliterator`的`features()`包含所有给定的特征,则返回`true`。 7. **`boolean tryAdvance(Consumer action)`**:如果存在剩余元素,则对其执行给定操作,并返回`true`; 否则返回`false`。 8. **`Spliterator trySplit()`**:如果可以对分离器进行分区,则返回一个覆盖元素的`Spliterator`,从该方法返回后,该分离器将不覆盖该元素。 ## 3\. Java `Spliterator`示例 #### 3.1 `Spliterator`特性示例 验证从[`ArrayList`](https://howtodoinjava.com/java-arraylist/)获得的`Spliterator`特性的 Java 示例。 ```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"); } ``` 程序输出。 ```java true ORDERED SIZED SUBSIZED ``` #### 3.2 `Spliterator estimateSize()`和`getExactSizeIfKnown()`示例 Java 示例,用于获取支持集合的大小,即由 spliterator 迭代的元素数量。 ```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()); ``` 程序输出: ```java 4 4 ``` #### 3.3 `Spliterator getComparator()`示例 查找分配器使用的比较器的 Java 示例。 ```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()); ``` 程序输出: ```java [D, C, B, A] java.util.Collections$ReverseComparator@7852e922 ``` #### 3.4 `Spliterator trySplit()`示例 Java 示例,将元素分为两组并独立进行迭代。 ```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); ``` 程序输出: ```java D E F ======== A B C ``` #### 3.5 `Spliterator forEachRemaining()`示例 使用`forEachRemaining()`方法在单个语句中执行`hasNext()`和`next()`操作的 Java 示例。 ```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); ``` 程序输出: ```java A B C D ``` ## 4。总结 在本教程中,我们学习了 Java `Spliterator`接口。 我们学习了`Spliterator`方法和一些简单示例,以遍历集合元素和流,这与`Spliterator`中的其他有用方法分开。 将我的问题放在评论部分。 学习愉快! 参考文献: [`Spliterator`接口 Java 文档](https://docs.oracle.com/javase/8/docs/api/java/util/Spliterator.html)