Iterable接口
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接口相关推荐
- Iterator、Iterable接口的使用及详解
Java集合类库将集合的接口与实现分离.同样的接口,可以有不同的实现. Java集合类的基本接口是Collection接口.而Collection接口必须实现Iterator接口. 以下图表示集合框架 ...
- java--迭代(一)Iterator和Iterable接口
摘自:http://www.cnblogs.com/redcoatjk/articles/4863340.html Iterable:顾名思义,实现了这个接口的对象支持迭代,是可迭代的. Iterat ...
- iterable java_java 集合框架(二)Iterable接口
Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator iterator() 返回 ...
- java iterable_Java基础之Iterable接口
Iterable接口是Java集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素. 查看源码 package java.lang; import java.util.Iterator; ...
- java iterable 使用,Java中Iterable接口和迭代器
1.Java集合类的基本接口是Collection接口.而Collection接口必须继承java.lang.Iterable接口 Iterable 接口只有一个方法: public interfac ...
- Iterable 接口解析
Iterable<T> 接口解析 一.说明 源码中对 Iterable 的说明是这样的:Implementing this interface allows an object to be ...
- java中iterable_java-如何实现Iterable接口?
Iterable是通用接口. 您可能遇到的问题(实际上并没有说出您遇到的问题,如果有的话)是,如果您使用通用接口/类而不指定类型实参,则可以擦除不相关的通用类型 在课堂上. 在非通用引用非通用返回类型 ...
- 038_JDK的Iterable接口
package java.lang;public interface Iterable<T> {Iterator<T> iterator(); }
- java 集合 接口_Java集合之Collection接口
1 - Java集合介绍 /* 1. 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要对对象进行存储. 2. 另一方面,使用Array存储对象方面具有一些弊 端,而 ...
最新文章
- SpringBoot复习:4(@ImportResource)
- 商汤科技总裁张文谈人工智能: 未来10年到20年会有巨大爆发 下一个井喷是AI+教育
- Solr -- Solr Facet 2
- 【C 语言】文件操作 ( 配置文件读写 | 完整代码示例 ) ★
- 《图解HTTP》读书笔记--第1章 了解Web及网络基础
- 设计模式------中介者模式
- 每天一道LeetCode-----计算一个直方图空隙的容量(如果装水能装多少)
- pwd 查看”当前工作目录“的完整路径
- Spring @Order批注
- Python3 中的 asyncio async await 概念(实例)(ValueError: too many file descriptors in select())
- 使用jsoncpp解析json文件
- Redis 突然变 慢 了,是运维还是开发的错?
- NLP学习—19.检索式对话系统中的rank评估指标、rank技术(Point-wise/Pair-wise/List-wise)以及RankNet、LambdaRank、LambdaMART
- tomcat配置方法
- bootstarp怎么使盒子到最右边_疯狂搞机 | 联通IPTV盒子免拆安装第三方软件
- 为什么域名还会被DNS污染?域名被污染清洗方法!
- 基于安卓系统(android)记事本APP管理系统设计与实现
- 亚马逊工资翻倍!本地人士担忧:房价又要...
- Ubuntu 桌面便签小工具-Indicator Stickynotes
- 2021年焊工(初级)考试报名及焊工(初级)免费试题
热门文章
- 清华大学钢铁产业高级工商管理研修班(第九期)
- 一大波吐槽来袭!网友:边骂边买...
- 剧本翻译之メンアットワーク!4 ~ハンター達よ永遠に~猎人们的永远(序章1)...
- 电脑桌面显示计算机信息,怎么显示我的电脑到桌面
- 论文阅读和分析:Hybrid Mathematical Symbol Recognition using Support Vector Machines
- 百度地图自定义覆盖物,随地图缩放、拖曳偏移解决办法
- svc预测概率_利用Python高概率预测英雄联盟胜负,分析了1982场才得出的数据!...
- 华为Mate 20系列演绎AI黑科技,AR翻译帮用户走遍天下告别语言障碍
- taro 的项目结构_Taro小程序,从0到1架构项目,打造自己的完美脚手架。
- 计算机相关的专业知识试题,公务员考试:计算机专业试卷综合试题(含参考答案)...