Java 源码阅读 - Iterable (可迭代对象)

139 阅读2分钟

介绍

IterableCollections - 集合 的父类, 也是所有集合相关的数据结构的基础接口, 我在自己的项目中发现有大约 6000 多个三方包都实现了这个接口, 其中不乏有 Netty, Gurva 这类知名的第三方包, 因此读懂这个类对于理解 Java 的集合是非常有必要的

接口方法

方法名简介
iterator()返回一个 iterator 对象, 其中包含的元素为 T 这个泛型类
forEach()default 方法, 遍历对象中的每个元素
spliterator()default 方法, 返回一个该迭代器的 Spliterators 对象

iterator()

Iterator<T> iterator();

这个接口方法定义了所有实现类必须要实现的一个方法, 该方法要求返回一个迭代器对象. 可以用于顺序遍历该集合中的所有对象

使用方式

ArrayList<String> list = new ArrayList<>();
list.add("One");
list.add("Two");
list.add("Three");

// 获取迭代器
Iterator<String> iterator = list.iterator();

forEach()

Java 8 新增

源码

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

接受一个在JAVA8中新增的java.util.function.Consumer消费行为 或者称之为动作 (Consumer action )类型, 然后对每个元素执行消费行为直到出现异常或者执行完毕

Consumer 类 接口类, 通过方法 accept() 来执行一个动作

使用方式

ArrayList<String> people = new ArrayList<>();
people.add("张三");
people.add("张三");

people.foreach(p -> System.print.out(p));

一般来说, 我们在使用 foreach 处理元素时, 会使用 Lambda 表达式创建一个匿名函数来对该集合内部的所有元素进行操作, 使代码更加简洁

spliterator()

Java 8 新增

default Spliterator<T> spliterator() {
    return Spliterators.spliteratorUnknownSize(iterator(), 0);
}

该方法主要返回一个 Spliterators (splitable iterator, 可分割迭代器) , 用来遍历和分割序列, 主要用于并行流 (parallelStream) 的遍历, 其中包含可以将集合分割的方法, 用于多个线程同时进行访问操作