Java diference between java.lang.spliterator and java.lang.Iterator and java.lang.Iterable - TongtongLan/Java GitHub Wiki
There are three methods in this interface.
Iterator<T> iterator();
default void forEach(Consumer<? super T> action)
@since 1.8
{
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator()
@since 1.8
{
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
boolean hasNext();
E next();
default void remove()
@since 1.8
{
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action)
@since 1.8
{
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
对于Spliterator接口的设计思想,应该要提到的是Java7的Fork/Join(分支/合并)框架,总得来说就是用递归的方式把并行的任务拆分成更小的子任务,然后把每个子任务的结果合并起来生成整体结果。带着这个理解来看看Spliterator接口提供的方法
实现示例可查看 java8 stream 中Spliterator的使用(一).但是,以上文章还有一些问题,又写了第二篇 java8 stream 中Spliterator的使用(二)java8 stream 中Spliterator的使用(二)
boolean tryAdvance(Consumer<? super T> action);
default void forEachRemaining(Consumer<? super T> action)
{
do { } while (tryAdvance(action));
}
Spliterator<T> trySplit();
long estimateSize();
default long getExactSizeIfKnown()
{
return (characteristics() & SIZED) == 0 ? -1L : estimateSize();
}
int characteristics();
default boolean hasCharacteristics(int characteristics)
{
return (characteristics() & characteristics) == characteristics;
}
default Comparator<? super T> getComparator()
{
throw new IllegalStateException();
}
Spliterator(splitable iterator可分割迭代器)接口是Java为了并行遍历数据源中的元素而设计的迭代器,这个可以类比最早Java提供的顺序遍历迭代器Iterator,但一个是顺序遍历,一个是并行遍历
从最早Java提供顺序遍历迭代器Iterator时,那个时候还是单核时代,但现在多核时代下,顺序遍历已经不能满足需求了...如何把多个任务分配到不同核上并行执行,才是能最大发挥多核的能力,所以Spliterator应运而生啦
因为对于数据源而言...集合是描述它最多的情况,所以Java已经默认在集合框架中为所有的数据结构提供了一个默认的Spliterator实现,相应的这个实现其实就是底层Stream如何并行遍历(Stream.isParallel())的实现啦,因此平常用到Spliterator的情况是不多的...因为Java8这次正是一次引用函数式编程的思想,你只需要告诉JDK你要做什么并行任务,关注业务本身,至于如何并行,怎么并行效率最高,就交给JDK自己去思考和优化速度了(想想以前写如何并发的代码被支配的恐惧吧)作为调用者我们只需要去关心一些filter,map,collect等业务操作即可
想要看Spliterator的实现,可以直接去看JDK对于集合框架的实现,很多实现类你可以在Spliterators中找到的,也可以直接去你对应集合的stream方法中找到,比如ArrayList点进去的是Collection的默认实现,只需要提供一个Spliterator的实现,然后用StreamSupport就可以构造一个Stream了,相当方便
Code
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}