Java diference between java.lang.spliterator and java.lang.Iterator and java.lang.Iterable - TongtongLan/Java GitHub Wiki

java.lang.Iterable

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);
}

java.lang.Iterator

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());
}

java.lang.spliterator

对于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();
}

diference between java.lang.spliterator and java.lang.Iterator

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);
}
⚠️ **GitHub.com Fallback** ⚠️