Iterable接口

Iterable接口

总览

这个接口用来代表能够进行迭代。具体的迭代方式,能够经过iterator()方法获取到一个迭代器,在迭代器中会实现如何获取下一个元素,以及是否迭代结束。java

java8中源码以下:segmentfault

public interface Iterable<T> {

    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
 
    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

 

 

能够看到在接口中主要有3个方法ui

  1. Iterator iterator(); 用来返回一个 Iterator
  2. forEach, 存在一个默认实现,很明显能够看到就是用来遍历Iterable中的全部元素
  3. spliterator, 返回来返回一个Spliterator, 用来代表如何对元素进行分割

Iterable 和 Iterator

从字面意思来看: Iterable 具备迭代能力的; Iterator 迭代器 Iterable的派生类都是具备迭代能力的,具备迭代能力的前提是,须要实现一个Iterator对象来代表如何进行迭代。this

为何将Iterable和Iterator分开

  1. 能够很明显的预测到,集合类会做为参数,在各个方法中进行传递。若是在集合类中耦合迭代器,那么在各个方法中进行遍历的时候,都会对迭代器的位置信息进行修改。当后续进行使用的时候,会不清楚当前迭代器的位置在哪里,则每次使用以前,须要reset一下位置,而后才敢继续使用。
  2. 因此将二者分离的好处就提现出来了,每次从集合类中获取Iterator的时候,集合类new一个新的Iterator返回,每次都是从初始位置开始。

forEach 方法

default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

 

 

Java8中新增的方式,方法前面加了default 代表这是一个默认方法,关于默认方法,能够看这篇文章.spa

方法的内容很简单,遍历每个元素,对每一个元素执行传入的操做。  注意一点: 若是在执行传入操做的时候,抛异常了,那么会中端遍历的执行。code

Spliterator接口

  • 参考文章1文章2
  • Spliterator接口是用来明确以何种方式将集合分割成多个小集合的,分割成小集合的目的是为了进行并行计算
  • 看一下Spliterator接口
public interface Spliterator<T> {

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

    public static final int ORDERED    = 0x00000010;
    public static final int DISTINCT   = 0x00000001;
    public static final int SORTED     = 0x00000004;
    public static final int SIZED      = 0x00000040;
    public static final int NONNULL    = 0x00000100;
    public static final int IMMUTABLE  = 0x00000400;
    public static final int CONCURRENT = 0x00001000;
    public static final int SUBSIZED = 0x00004000;

}

 

 

其中比较重要的是trySplit方法,用来代表如何进行分割。对象

相关文章
相关标签/搜索