Java Iterator/Iterable/Spliterator 语法速查手册
Java Iterator/Iterable/Spliterator 语法速查手册 的完整教学讲解。
0. 本节阅读指引(先读这一节)
本篇是「Iterator / Iterable / Spliterator」语法速查手册,按需查阅。
零基础第一遍只读:Iterator 接口与 Iterable 接口,理解 for-each 的底层原理;Spliterator、StreamSupport、自定义 Iterator、ListIterator 遇到再查。
前置:020 集合框架详解。
Iterator 接口
基本写法:获取迭代器
<collection>.iterator();
// 从集合获取迭代器
Iterator<String> it = list.iterator();
基本写法:遍历
while (<it>.hasNext()) { <类型> <变量> = <it>.next(); }
// 经典迭代器遍历
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}
基本写法:移除元素
<it>.remove();
// 移除最近 next() 返回的元素
it.remove();
基本写法:forEachRemaining
<it>.forEachRemaining(<消费者>);
// 用 lambda 处理剩余元素
it.forEachRemaining(System.out::println);
Iterable 接口
基本写法:实现 Iterable
public class <类> implements Iterable<<类型>> {
public Iterator<<类型>> iterator() { ... }
}
// 自定义可迭代集合
public class MyList implements Iterable<String> {
public Iterator<String> iterator() { return list.iterator(); }
}
基本写法:增强 for 循环
for (<类型> <变量> : <iterable>) { }
// 任何 Iterable 都可用增强 for
for (String s : myList) {
System.out.println(s);
}
基本写法:默认 forEach
<iterable>.forEach(<消费者>);
// Iterable 接口的默认方法
list.forEach(System.out::println);
基本写法:spliterator
<iterable>.spliterator();
// 获取可分割迭代器
Spliterator<String> sp = list.spliterator();
Spliterator 可分割迭代器
基本写法:tryAdvance 单个处理
<sp>.tryAdvance(<消费者>);
// 处理一个元素返回是否还有
boolean has = sp.tryAdvance(System.out::println);
基本写法:forEachRemaining
<sp>.forEachRemaining(<消费者>);
// 处理所有剩余元素
sp.forEachRemaining(System.out::println);
基本写法:尝试分割
<sp>.trySplit();
// 把迭代器一分为二用于并行
Spliterator<String> other = sp.trySplit();
基本写法:估算大小
<sp>.estimateSize();
// 估算剩余元素数量
long n = sp.estimateSize();
基本写法:特征
<sp>.characteristics();
// 返回特征位
int chars = sp.characteristics();
boolean sorted = sp.hasCharacteristics(Spliterator.SORTED);
StreamSupport 转 Stream
基本写法:Spliterator 转 Stream
StreamSupport.stream(<spliterator>, <并行>);
// 把 Spliterator 转为 Stream
Stream<String> s = StreamSupport.stream(sp, false);
基本写法:从迭代器创建流
StreamSupport.stream(Spliterators.spliteratorUnknownSize(<it>, 0), false);
// Iterator 转 Stream
Stream<String> s = StreamSupport.stream(
Spliterators.spliteratorUnknownSize(it, 0), false);
自定义 Iterator
基本写法:实现 Iterator
public class <类> implements Iterator<<类型>> {
public boolean hasNext() { ... }
public <类型> next() { ... }
}
// 自定义迭代器
public class RangeIt implements Iterator<Integer> {
private int cur, end;
public RangeIt(int s, int e) { cur = s; end = e; }
public boolean hasNext() { return cur < end; }
public Integer next() { return cur++; }
}
ListIterator 双向迭代
基本写法:获取 ListIterator
<list>.listIterator();
// 获取双向迭代器
ListIterator<String> li = list.listIterator();
基本写法:向前遍历
<li>.hasPrevious(); <li>.previous();
// 反向遍历
while (li.hasPrevious()) {
String s = li.previous();
}
基本写法:set 修改
<li>.set(<值>);
// 修改最近 next/previous 返回的元素
li.set("new");
基本写法:add 插入
<li>.add(<值>);
// 在当前位置插入元素
li.add("inserted");
基本写法:nextIndex/previousIndex
<li>.nextIndex();
// 返回下一个元素索引
int i = li.nextIndex();