介绍
Spliterator(splitable iterator可分割迭代器)接口是Java为了并行遍历数据源中的元素而设计的迭代器,这个可以类比最早Java提供的顺序遍历迭代器Iterator,但一个是顺序遍历,一个是并行遍历。
为什么有了Iterator还需要spliterator呢
从最早Java提供顺序遍历迭代器Iterator时,那个时候还是单核时代,但现在多核时代下,顺序遍历已经不能满足需求了,如何把多个任务分配到不同核上并行执行,才是能最大发挥多核的能力,所以Spliterator应运而生。
Spliterator 常用函数
Characteristics
函数定义为int characteristics(),此方法返回此分隔符及其元素的一组特征。它可以是以下8个值中的任何一个。以下所有值都是静态最终整数值:
- ORDERED:此值用于表示为分隔符元素定义了遇到顺序。
- DISTINCT:此值表示元素遇到的每对元素是否相等。如果我们从集合创建分离器,它将始终是DISTINCT。
- IMMUTABLE:此值表示是否无法修改元素的来源,即我们不能添加,替换或删除任何元素。 NONNULL:此值表示遇到的元素不会为空。
- SIZED:表示estimateSize()方法返回的值表示有限大小。
- SORTED:表示该元素总是有序。
- SUBSIZED:表示由返回的所有分隔符trySplit()将为 SIZED和SUBSIZED。
- CONCURRENT:表示可以同时修改源,即,我们可以使用多个线程并发地添加,删除或删除元素,而无需同步。
hasCharacteristics()函数
定义格式:
- boolean hasCharacteristics(int characteristics)
- characteristics()上面已经解释过的方法用于找出分离器的特性。
- hasCharacteristics用于检查分隔符是否包含所有特征。
- 它返回一个布尔值。'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