Java Spliterator.trySplit() 方法及代码示例

尝试分割当前的可拆分迭代器

定义

Spliterator<T> trySplit()

返回值

返回一个涵盖元素的某些部分的  Spliterator,如果这个  Spliterator 不能被拆分, 则返回 null.

说明

如果当前 Spliterator 可以拆分, 则返回一个涵盖元素的 Spliterator, 那将取决于方法的返回, 而不是当前 Spliterator 的元素涵盖情况.

如果这个 SpliteratorORDERED 的, 则返回的 Spliterator 必须严格涵盖当前 Spliterator 的头部元素.

除非这个 Spliterator 涵盖无限的元素, 否则重复调用 tryssplit() 最终必然返回 null. 是否非空返回取决于:

  • 拆分前 estimateSize() 返回的值, 在拆分后必须大于或等于 estimateSize() 和返回的 SpliteratorestimateSize()之和, 以及
  • 如果这个 SpliteratorSUBSIZED 的, 那么这个 Spliterator 在分割前的 estimateSize() 必须等于 estimateSize() 和返回的 SpliteratorestimateSize() 之和

该方法可能会由于任何原因而返回 null, 包括空、遍历开始后无法拆分的、数据结构约束的和处于效率考虑的

注意事项

API 注意事项

尽管理想化的 trySplit() 方法会有效地(无需遍历)将其元素精确地一分为二, 从而实现均衡的并行计算. 但许多偏离这一理想化的方法仍然非常有效; 例如, 仅对近似均衡的树进行近似拆分, 或者对于叶子节点可能包含一个或两个元素的树, 不会进一步拆分这些节点. 然而, 均衡偏差过大抑或过度低效的 trySplit() 机制通常会导致并行性能不佳.

示例

拆分可拆分迭代器的示例

package com.yi21.spliterator;

import java.util.Set;
import java.util.Spliterator;
import java.util.stream.Stream;

public class Yi21SpliteratorTrySplit {

    public static void main(String[] args) {

        Set<String> set = Set.of("One Elemet");
        Spliterator<String> iterator = set.spliterator();
        System.out.println("拆分单个元素的 set: " + iterator.trySplit());

        set = Set.of("One", "Two", "Tree");
        iterator = set.spliterator();
        Spliterator<String> iterator1 = iterator.trySplit();
        System.out.println("尝试拆分3个元素的 set 后:");
        System.out.println("原迭代器的遍历: ");
        iterator.forEachRemaining(System.out::println);
        System.out.println("新迭代器的遍历: ");
        iterator1.forEachRemaining(System.out::println);

        //无限的流生成的迭代器
        Spliterator<Integer> infiniteIterator = Stream.iterate(0, i -> i + 2).spliterator();
        System.out.println("无限元素迭代器的拆分? " + infiniteIterator.trySplit());

    }

}

执行结果为 :

拆分单个元素的 set: null
尝试拆分3个元素的 set 后:
原迭代器的遍历:
新迭代器的遍历:
Two
One
Tree
无限元素迭代器的拆分? java.util.Spliterators$ArraySpliterator@3f102e87