Java 集合学习笔记:IterableIterator

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 集合学习笔记:IterableIterator相关的知识,希望对你有一定的参考价值。

Java 集合学习笔记:Iterable、Iterator

UML


此图内含 Collection.uml 可在 Idea 中打开

在学习设计模式的时候就有一个"迭代器模式",JDK中提供了一套实现:Iterator
Java中有了 泛型 + 迭代器 感觉下半辈子基本就告别手动实现迭代器模式了。

Iterable_可迭代

JDK8 之前

此接口表示容器实现了迭代器模式,拥有 iterator() 方法,可以返回一个迭代器对象 Iterator

限定符和类型方法和说明
Iterator<T>iterator()
唯一的方法用来返回一个迭代器 Iterator 对象。

JDK8 新增 default 方法

限定符和类型方法和说明
default voidforEach(Consumer<? super T> action)
Iterable的每个元素执行给定的操作action,直到处理完所有元素或操作抛出异常为止。
default Spliterator<T>Spliterator spliterator()
在这个Iterable所描述的元素上创建一个 Spliterator 可分迭代器。

forEach挺好用的,相信很多人已经用上了。它底层是 for( obj : list) 所以 remove 的老坑还在。
遍历中需要删除元素的时候,乖乖用 Iteratornext() + remove()

List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
list.forEach(System.out::println);

spliterator 返回一个可拆分迭代器。做并发处理拆分任务时用的上。

List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
Spliterator<Integer> spliterator = list.spliterator();
Spliterator<Integer> spliterator2 = spliterator.trySplit();

System.out.println("原 spliterator:");
spliterator.forEachRemaining(System.out::print); // 原 spliterator:345

System.out.println("\\n拆分出去的 spliterator2:");
spliterator2.forEachRemaining(System.out::print); // 拆分出去的 spliterator2:12

Iterator_迭代器

JDK8 之前

迭代器接口,定义了一个迭代器所必须实现的方法。

限定符和类型方法和说明
booleanhasNext()
后面还有更多元素时返回true
Enext()
返回下一个元素。
default voidremove()
移除刚才next()返回的元素。remove 只能与next成对使用。
  • 示例代码
// 借助 Arrays.asList 初始化一个 ArrayLIst
List<Integer> arrayList = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
// 证明 arrayList 可写。 ( Arrays.asList 返回的 List 是只读 )
arrayList.add(6);
System.out.println(arrayList);
// 获取迭代器
Iterator<Integer> iterator = arrayList.iterator();
while (iterator.hasNext())
    Integer ele = iterator.next();
    System.out.println(ele);
    if(ele == 3) iterator.remove(); // 元素等于 3 删除            

System.out.println(arrayList); // 检查结果

JDK8 新增 default 方法

修饰符和返回类型方法和说明
default voidforEachRemaining
它接受一个消费者,对剩余的元素进行逐个处理。
List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
Iterator<Integer> iterator = list.iterator();
iterator.next();
iterator.next();
// 1、2 已经被迭代过了,forEachRemaining 只会对剩余的元素进行操作。
iterator.forEachRemaining(System.out::print); // 345

参考资料

笑虾:forEach 遍历中 remove 的BUG,及 Java8 的新推荐。

java.lang.Iterable 可迭代
java.util.Iterator 迭代器
java.util.Collection
java.util.List
java.util.ArrayList

以上是关于Java 集合学习笔记:IterableIterator的主要内容,如果未能解决你的问题,请参考以下文章

Java集合源码学习笔记ArrayList分析

Java学习笔记系列-基础篇-集合

Java集合_学习笔记

Java 集合学习笔记:HashMap

Java 学习笔记 - 集合运算

Java 集合学习笔记:AbstractList