-
普通 for 循环
样子:
java
for (int i = 0; i < list.size(); i++) {
盒子 b = list.get(i);
}
你自己拿着编号 0、1、2... 自己去货架上拿。
优点:
-
想拿第几个就拿第几个,还能顺手改里面的货。
缺点:
-
自己数号码累,数错就"越界"摔地上;对 Set、Map 这类没编号的货架用不了。
-
增强 for 循环(for-each)
样子:
java
for (盒子 b : list) {
扫一下 b;
}
仓库管理员把盒子一个一个递到你手上,你不用管号码。
优点:
-
代码最少,不会数错号。
缺点:
-
他递给你时你不能中途"抽走"某个盒子(删不了),也不知道是第几个。
-
Iterator(迭代器)
样子:
java
Iterator<盒子> it = list.iterator();
while (it.hasNext()) {
盒子 b = it.next();
if (b 是坏的) it.remove(); // 直接扔掉
}
给你一把"智能扫码枪",扫一个出一个,还能顺手把坏的丢垃圾桶。
优点:
-
边扫边扔安全,不会砸到脚。
缺点:
-
要多写几行;只能单向扫,不能回头。
-
ListIterator(双向扫码枪)
样子:
java
ListIterator<盒子> it = list.listIterator();
while (it.hasNext()) { 正着扫; }
while (it.hasPrevious()) { 倒着扫; }
扫码枪带"倒车"键,可以前后来回扫,还能在任意位置插新盒子。
优点:
-
能回头、能插货、能改货。
缺点:
-
只有 List 货架能用;代码更啰嗦。
-
JDK 8 的 forEach + Lambda
样子:
java
list.forEach(b -> {
扫一下 b;
});
管理员直接开传送带,盒子哗哗流过,你站在旁边"盖章"。
优点:
-
一句话搞定,看着爽。
缺点:
-
传送带一旦开动就停不下来(不能 break);想删盒子也删不了。
-
Stream API(带流水线的高级传送带)
样子:
java
list.stream()
.filter(b -> b 是好的)
.map(b -> b 打标签)
.forEach(b -> 入库);
不但传送,还能自动把坏的踢出去、把盒子贴标签、最后分组装箱,全程不用你动手。
优点:
-
功能最强大,支持并行(多线程一起干)。
缺点:
-
小仓库用就显得"杀鸡用牛刀";调试略麻烦;同样改不了原货架。
| 场景 | 用啥 |
|---|---|
| 只看看,不删不改 | 增强 for |
| 要删元素 | Iterator |
| 要来回/插元素 | ListIterator |
| 要编号 | 普通 for |
| 想写酷炫一行代码 | forEach Lambda |
| 数据量大还要过滤、分组 | Stream |
"只看不碰用增强 for,要删就用 Iterator,要编号回普通 for,酷炫一行上 Lambda,复杂流水线 Stream 来帮忙。"