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> {//如果有下一个元素,则返回trueboolean 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. Iterator、Iterable接口的使用及详解

    Java集合类库将集合的接口与实现分离.同样的接口,可以有不同的实现. Java集合类的基本接口是Collection接口.而Collection接口必须实现Iterator接口. 以下图表示集合框架 ...

  2. java--迭代(一)Iterator和Iterable接口

    摘自:http://www.cnblogs.com/redcoatjk/articles/4863340.html Iterable:顾名思义,实现了这个接口的对象支持迭代,是可迭代的. Iterat ...

  3. iterable java_java 集合框架(二)Iterable接口

    Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator iterator() 返回 ...

  4. java iterable_Java基础之Iterable接口

    Iterable接口是Java集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素. 查看源码 package java.lang; import java.util.Iterator; ...

  5. java iterable 使用,Java中Iterable接口和迭代器

    1.Java集合类的基本接口是Collection接口.而Collection接口必须继承java.lang.Iterable接口 Iterable 接口只有一个方法: public interfac ...

  6. Iterable 接口解析

    Iterable<T> 接口解析 一.说明 源码中对 Iterable 的说明是这样的:Implementing this interface allows an object to be ...

  7. java中iterable_java-如何实现Iterable接口?

    Iterable是通用接口. 您可能遇到的问题(实际上并没有说出您遇到的问题,如果有的话)是,如果您使用通用接口/类而不指定类型实参,则可以擦除不相关的通用类型 在课堂上. 在非通用引用非通用返回类型 ...

  8. 038_JDK的Iterable接口

    package java.lang;public interface Iterable<T> {Iterator<T> iterator(); }

  9. java 集合 接口_Java集合之Collection接口

    1 - Java集合介绍 /* 1. 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储. 2. 另一方面,使用Array存储对象方面具有一些弊 端,而 ...

最新文章

  1. SpringBoot复习:4(@ImportResource)
  2. 商汤科技总裁张文谈人工智能: 未来10年到20年会有巨大爆发 下一个井喷是AI+教育
  3. Solr -- Solr Facet 2
  4. 【C 语言】文件操作 ( 配置文件读写 | 完整代码示例 ) ★
  5. 《图解HTTP》读书笔记--第1章 了解Web及网络基础
  6. 设计模式------中介者模式
  7. 每天一道LeetCode-----计算一个直方图空隙的容量(如果装水能装多少)
  8. pwd 查看”当前工作目录“的完整路径
  9. Spring @Order批注
  10. Python3 中的 asyncio async await 概念(实例)(ValueError: too many file descriptors in select())
  11. 使用jsoncpp解析json文件
  12. Redis 突然变 慢 了,是运维还是开发的错?
  13. NLP学习—19.检索式对话系统中的rank评估指标、rank技术(Point-wise/Pair-wise/List-wise)以及RankNet、LambdaRank、LambdaMART
  14. tomcat配置方法
  15. bootstarp怎么使盒子到最右边_疯狂搞机 | 联通IPTV盒子免拆安装第三方软件
  16. 为什么域名还会被DNS污染?域名被污染清洗方法!
  17. 基于安卓系统(android)记事本APP管理系统设计与实现
  18. 亚马逊工资翻倍!本地人士担忧:房价又要...
  19. Ubuntu 桌面便签小工具-Indicator Stickynotes
  20. 2021年焊工(初级)考试报名及焊工(初级)免费试题

热门文章

  1. 清华大学钢铁产业高级工商管理研修班(第九期)
  2. 一大波吐槽来袭!网友:边骂边买...
  3. 剧本翻译之メンアットワーク!4 ~ハンター達よ永遠に~猎人们的永远(序章1)...
  4. 电脑桌面显示计算机信息,怎么显示我的电脑到桌面
  5. 论文阅读和分析:Hybrid Mathematical Symbol Recognition using Support Vector Machines
  6. 百度地图自定义覆盖物,随地图缩放、拖曳偏移解决办法
  7. svc预测概率_利用Python高概率预测英雄联盟胜负,分析了1982场才得出的数据!...
  8. 华为Mate 20系列演绎AI黑科技,AR翻译帮用户走遍天下告别语言障碍
  9. taro 的项目结构_Taro小程序,从0到1架构项目,打造自己的完美脚手架。
  10. 计算机相关的专业知识试题,公务员考试:计算机专业试卷综合试题(含参考答案)...