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 void | forEach(Consumer<? super T> action) 对 Iterable 的每个元素执行给定的操作action ,直到处理完所有元素或操作抛出异常为止。 |
default Spliterator<T> | Spliterator spliterator() 在这个 Iterable 所描述的元素上创建一个 Spliterator 可分迭代器。 |
forEach
default void forEach(Consumer<? super T> action)
Objects.requireNonNull(action);
for (T t : this)
action.accept(t);
forEach
挺好用的,相信很多人已经用上了。它底层是 for( obj : list)
所以 remove
的老坑还在。
遍历中需要删除元素的时候,乖乖用 Iterator
的next()
+ remove()
。
List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
list.forEach(System.out::println);
spliterator
default Spliterator<T> spliterator()
return Spliterators.spliteratorUnknownSize(iterator(), 0);
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 之前
迭代器接口,定义了一个迭代器所必须实现的方法。
限定符和类型 | 方法和说明 |
---|---|
boolean | hasNext() 后面还有更多元素时返回 true 。 |
E | next() 返回下一个元素。 |
void | remove() 移除刚才 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 void | void remove() 从基础集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用next时只能调用一次此方法。如果在迭代进行时,以调用此方法以外的任何方式修改了底层集合,则迭代器的行为将不指定。 |
default void | forEachRemaining 它接受一个消费者,对 剩余 的元素进行逐个处理。 |
remove
但 Iterator
并没有具体实现。
default void remove()
throw new UnsupportedOperationException("remove");
forEachRemaining
default void forEachRemaining(Consumer<? super E> action)
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
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的主要内容,如果未能解决你的问题,请参考以下文章