Iterable接口


通常在分析一个类的时候,会按照介绍,数据结构,源码,分析再到使用的过程。

第1部分 Iterable接口介绍

Iterable简介

Iterable是一个可迭代接口,与之前版本相比,增加了forEach迭代和获取Spliterator方法。
Iterable提供获取Iterator迭代器方法,用以支持集合遍历。
Iterable提供获取Spliterator可分割迭代器方法,用以支持集合的并发遍历。

Iterable常用API

修饰语和返回类型方法描述
Iterator<T>iterator()返回类型为T的迭代器
default Spliterator<T>spliterator()创建返回类型为T的可分割迭代器
default voidforEach(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

修饰语和返回类型方法描述
booleanhasNext()如果有下一个元素,则返回true
Enext()返回迭代器的下一个元素
default voidremove()删除迭代器上次返回的元素
default voidforEachRemaining(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

修饰语和返回类型方法描述
booleantryAdvance(Consumer<? super T> action)对下一个元素执行给定消费器的操作
default voidforEachRemaining(Consumer<? super T> action)对剩下元素迭代执行消费器的操作
SpliteratortrySplit()拆分前部分元素,并以这些元素返回一个新可分割迭代器

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的作用

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值