概述
Iterable接口
- 第1部分 Iterable接口介绍
- 第2部分 Iterable接口数据结构
- 第3部分 Iterator源码解析(基于JDK-8u201)
- 3.1 Iterator接口
- 3.2 Spliterator接口
通常在分析一个类的时候,会按照介绍,数据结构,源码,分析再到使用的过程。
第1部分 Iterable接口介绍
Iterable简介
Iterable是一个可迭代接口,与之前版本相比,增加了forEach迭代和获取Spliterator方法。
Iterable提供获取Iterator迭代器方法,用以支持集合遍历。
Iterable提供获取Spliterator可分割迭代器方法,用以支持集合的并发遍历。
Iterable常用API
修饰语和返回类型 | 方法 | 描述 |
---|---|---|
Iterator<T> | iterator() | 返回类型为T的迭代器 |
default Spliterator<T> | spliterator() | 创建返回类型为T的可分割迭代器 |
default void | forEach(Consumer<? super T> action) | 迭代元素,执行消费器的accept方法 |
第2部分 Iterable接口数据结构
Iterable的UML图
图1 terable的UML图
在JDK8后的接口改变比较大,由于增加了函数式编程以及接口支持default类型的方法实现,接口变得更加丰富。
在JDK8中可以看到与之前版本两个比较大的差别,分别是增加了lamada迭代的forEach方法以及增加了一个可分割迭代器。这意味着从此集合多了一个迭代器,用于支持并发下的分片操作。Iterable提供了两种迭代器的获取方式,实现该接口的类,例如集合,都将具备这两种迭代功能
第3部分 Iterator源码解析(基于JDK-8u201)
public interface Iterable<T> {
//获取迭代器
Iterator<T> iterator();
//获取可分割迭代器,默认不指定分割范围
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
//迭代元素,执行消费器的accept方法
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
}
3.1 Iterator接口
Iterator接口介绍
Iterator提供了集合和流操作等的遍历方式,是迭代器模式的应用。
Iterator提供了hasNext方法来判断是否还有元素可以遍历。
Iterator提供了remove方法来移除下一个元素,默认不支持。
Iterator提供了forEachRemaining方法,对剩下的元素根据给定的消费器来处理。
Iterator接口常用API
修饰语和返回类型 | 方法 | 描述 |
---|---|---|
boolean | hasNext() | 如果有下一个元素,则返回true |
E | next() | 返回迭代器的下一个元素 |
default void | remove() | 删除迭代器上次返回的元素 |
default void | forEachRemaining(Consumer<? super E> action) | 对剩下的元素执行给定消费器的accept方法 |
Iterator接口相比之前没多大变化,只是对remove方法提供默认实现,同时提供了lamada表达式的迭代消费方法。
Iterator接口源码解析(基于JDK-8u201)
public interface Iterator<E> {
//如果有下一个元素,则返回true
boolean hasNext();
//获取下一个元素
E next();
//删除迭代器上次返回的元素,默认不支持
default void remove() {
throw new UnsupportedOperationException("remove");
}
//对剩下的元素执行给定消费器的accept方法
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
迭代器接口的函数比较简单,具体的实现交给子类实现,而remove的默认实现和forEachRemaining都不需要修改实现类的代码。这也是JDK8后接口提供default实现一个比较好的地方,实现类不需要感应到接口的改变,就能增加功能,对实现类的代码侵入性几乎为零。
3.2 Spliterator接口
Spliterator接口介绍
Spliterator是JDK8开始提供的接口,用于支持迭代器的并发操作。
Spliterator提供tryAdvance方法处理单个元素。
Spliterator提供forEachRemaining方法批量处理剩余元素。
Spliterator提供trySplit方法对迭代器元素进行分片,返回一个新的可分割迭代器。
Spliterator接口常用API
修饰语和返回类型 | 方法 | 描述 |
---|---|---|
boolean | tryAdvance(Consumer<? super T> action) | 对下一个元素执行给定消费器的操作 |
default void | forEachRemaining(Consumer<? super T> action) | 对剩下元素迭代执行消费器的操作 |
Spliterator | trySplit() | 拆分前部分元素,并以这些元素返回一个新可分割迭代器 |
Spliterator接口源码解析(基于JDK-8u201)
public interface Spliterator<T> {
//对单个元素进行处理
boolean tryAdvance(Consumer<? super T> action);
//对剩下所有元素批处理
default void forEachRemaining(Consumer<? super T> action) {
do { } while (tryAdvance(action));
}
//尝试分片,如果能分,会用前部分元素创建一个可分割迭代器并返回
Spliterator<T> trySplit();
//获取特征码
int characteristics();
//获取比较器,默认非法状态
default Comparator<? super T> getComparator() {
throw new IllegalStateException();
}
//集合或流的集中状态,例如set为DISTINCT,每个元素都是不同的
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;
//。。。 省略4种迭代器子接口
对于源码分析,要“适可而止”,明确了分析的范围是集合源码后,对于一些关系不是很大的接口,了解其功能即可,没必要太深入了解,否则,只会拖枝带叶,导致分析范围越来越大。
刚开始分析Iterable接口的时候,对Spliterator也是很陌生,对于这种情况,最好的方式自然是百度看其他人的分析。然而,也应该掌握获取官方信息渠道,了解别人是怎么获取信息来源的,可根据以下方式,获取官方示例。
图2 从官网获取Spliterator示例方式
Spliterator的使用也可以参考 jdk8中Spliterator的作用
最后
以上就是老实芝麻为你收集整理的Iterable接口第1部分 Iterable接口介绍第2部分 Iterable接口数据结构第3部分 Iterator源码解析(基于JDK-8u201)的全部内容,希望文章能够帮你解决Iterable接口第1部分 Iterable接口介绍第2部分 Iterable接口数据结构第3部分 Iterator源码解析(基于JDK-8u201)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复