了解Java Spliterator

介绍

Spliterator(splitable iterator可分割迭代器)接口是Java为了并行遍历数据源中的元素而设计的迭代器,这个可以类比最早Java提供的顺序遍历迭代器Iterator,但一个是顺序遍历,一个是并行遍历。

为什么有了Iterator还需要spliterator呢

从最早Java提供顺序遍历迭代器Iterator时,那个时候还是单核时代,但现在多核时代下,顺序遍历已经不能满足需求了,如何把多个任务分配到不同核上并行执行,才是能最大发挥多核的能力,所以Spliterator应运而生。

Spliterator 常用函数

Characteristics

函数定义为int characteristics(),此方法返回此分隔符及其元素的一组特征。它可以是以下8个值中的任何一个。以下所有值都是静态最终整数值:

  1. ORDERED:此值用于表示为分隔符元素定义了遇到顺序。
  2. DISTINCT:此值表示元素遇到的每对元素是否相等。如果我们从集合创建分离器,它将始终是DISTINCT。
  3. IMMUTABLE:此值表示是否无法修改元素的来源,即我们不能添加,替换或删除任何元素。 NONNULL:此值表示遇到的元素不会为空。
  4. SIZED:表示estimateSize()方法返回的值表示有限大小。
  5. SORTED:表示该元素总是有序。
  6. SUBSIZED:表示由返回的所有分隔符trySplit()将为 SIZED和SUBSIZED。
  7. CONCURRENT:表示可以同时修改源,即,我们可以使用多个线程并发地添加,删除或删除元素,而无需同步

hasCharacteristics()函数
定义格式:

  1. boolean hasCharacteristics(int characteristics)
  2. characteristics()上面已经解释过的方法用于找出分离器的特性。
  3. hasCharacteristics用于检查分隔符是否包含所有特征。
  4. 它返回一个布尔值。'true’如果分隔符中存在所有特征,否则返回false。

tryAdvance

遍历源元素。

它返回一个布尔值,并以一个Consumer作为参数。如果存在任何元素,它将执行我们传递的Consumer作为参数,并返回’true’并移至下一个元素。如果遍历所有元素,则返回’false’。例如:

        String[] arr = {"1", "2", "3","3"};
        Spliterator<String> spliterator = Arrays.spliterator(arr);
        int a=0;
        while (spliterator.tryAdvance(System.out::println)){
            System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!"+ ++a);
        }

因此,我们已使用该spliterator()方法从中创建一个Spliterator。我们使用while循环来检查的当前返回值是否tryAdvance为true。如果为true,则在while条件内打印当前值。while循环的主体为空,我们可以将其用于其他任何操作.

trySplit 函数
在可能并行的操作中使用。

如果我们调用trySplit一个分隔符,它将返回一个分隔符,其中包含调用方分隔符不会覆盖的元素。这就是说,我们用它将分离器分成多个部分。这样做的主要好处trySplit是我们可以并行处理分割的元素。trySplit如果源包含有限数量的元素,则重复调用将返回null

 String[] arr = {"1", "2", "3", "4"};
        Spliterator<String> spliterator1 = Arrays.spliterator(arr);
        Spliterator stringSpliterator2 = spliterator1.trySplit();
        Spliterator stringSpliterator3 = spliterator1.trySplit();
        System.out.println("spliterator1spliterator1spliterator1spliterator1");
        //System.out.println("size"+spliterator1.estimateSize());
        while (spliterator1.tryAdvance(System.out::println)) {

        }
        System.out.println("stringSpliterator2stringSpliterator2stringSpliterator2");
        // System.out.println("size"+spliterator1.estimateSize());
        while (stringSpliterator2.tryAdvance(System.out::println)) {

        }
        System.out.println("stringSpliterator3stringSpliterator3stringSpliterator3string");
        //System.out.println("size"+spliterator1.estimateSize());
        while (stringSpliterator3.tryAdvance(System.out::println)) {

        }

输出结果:

spliterator1spliterator1spliterator1spliterator1
4
stringSpliterator2stringSpliterator2stringSpliterator2
1
2
stringSpliterator3stringSpliterator3stringSpliterator3string
3

正如预期,每个Spliterator中都有不同的字符。

EstimateSize()函数

返回元素总数的估计值。返回值的类型为long。

forEachRemaining

能够将Iterator中迭代剩余的元素传递给一个函数

        List<String> list = Arrays.asList("a", "b", "c", "d");
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            if ("c".equals(iterator.next())) {
                break;
            }
        }
        iterator.forEachRemaining(s -> System.out.println(s+"  "));

结果:

d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气满满@WJW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值