当前位置: 首页 > 图灵资讯 > 技术篇> 【java8】自定义Spliterator

【java8】自定义Spliterator

来源:图灵教育
时间:2023-04-24 10:22:33

  SpliteratorJava 另一个添加到8中的新接口;这个名字代表“可分迭代器”(splitableiterator)。和Iterator一样,Spliterator也用于遍历数据源中的元素,但它是为并行执行而设计的。

  Spliterator自定义需要实现Spliterator接口。Spliterator接口 public interface Spliterator { boolean tryAdvance(Consumer action); Spliterator trySplit(); long estimateSize(); int characteristics();} T:Spliterator遍历的元素类型 tryAdvance:类似于普通的Iterator,因为它会按顺序逐一使用Spliterator中的元素,如果有其他元素要经历,就会返回true。 trySplit:将一些元素划分为第二个Spliterator(由此方法返回),并行处理。 estimateSize:估计还剩下多少元素要遍历,让拆分均匀一点。 characteristics

  特 性

  含 义

  ORDERED

  元素有既定的顺序(如List),所以Spliterator在遍历和划分时也会遵循这个顺序

  DISTINCT

  对于任何一对经历过的元素x和y,x.equals(y)返回false

  SORTED

  遍历元素按照预定义的顺序排序

  SIZED

  Spliterator由已知大小的源(如Set)建立,因此estimatedSize()返回准确值

  NONNULL

  保证遍历元素不会是nulll

  IMMUTABLE

  Spliterator的数据源无法修改。这意味着任何元素都不能添加、删除或修改

  CONCURRENT

  其他线程可以同时修改Spliterator的数据源,而无需同步

  SUBSIZED

  Spliterator和Spliterator都是SIZED拆分过程

【java8】自定义Spliterator_java

自定义 package com.morris.java8.parallel;import java.util.Spliterator;import java.util.function.Consumer;import java.util.stream.IntStream;import java.util.stream.Stream;import java.util.stream.StreamSupport;public class IntSpliterator implements Spliterator { private int start; private int end; private int current; private int[] data; public Stream stream() { return StreamSupport.stream(this, false); } public Stream parallelStream() { return StreamSupport.stream(this, true); } public IntSpliterator(int[] data) { this(0, data.length, data); } public IntSpliterator(int start, int end, int[] data) { this.start = start; this.end = end; this.current = start; this.data = data; } @Override public boolean tryAdvance(Consumer action) { if(current < end) { action.accept(data[current++]); return true; } return false; } @Override public Spliterator trySplit() { if(start - end <= 2) { return null; } int mid=start+((end-start)/2); int newStart=mid; int newEnd=end; end=mid; return new IntSpliterator(newStart, newEnd, data); } @Override public long estimateSize() { return data.length - end; } @Override public int characteristics() { return Spliterator.ORDERED|Spliterator.SUBSIZED|Spliterator.SIZED; } public static void main(String[] args) { int[] ints = IntStream.rangeClosed(1, 10).toArray(); IntSpliterator intSpliterator = new IntSpliterator(ints); intSpliterator.stream().forEach(System.out::println); //intSpliterator.parallelStream().forEach(System.out::print); }}