215. Java 函数式编程风格 - 无限循环 + break 如何函数式改写?
🟧 场景:无限循环 + 条件中断
先来看一段常见的命令式写法:
for (int i = 0;; i = i + 3) {
if (i > 20) {
break;
}
System.out.println(i);
}
👀 特点解析:
- 无限循环:
for(;;)表示无上限循环。 - 步长:每次
i += 3。 - 条件中断:当
i > 20时用break退出循环。
✅ 函数式风格替代
我们可以使用 Java 9 中的 IntStream.iterate() 和 takeWhile() 来替代这一逻辑:
import java.util.stream.IntStream;
IntStream.iterate(0, i -> i + 3) // 无限流,从 0 开始,每次 +3
.takeWhile(i -> i <= 20) // 条件限制:当 i > 20 时停止
.forEach(System.out::println); // 执行操作
🧩 对照表解析
| 命令式部分 | 函数式替代 |
|---|---|
for(int i = 0;; i = i + 3) | IntStream.iterate(0, i -> i + 3) |
if (i > 20) break; | .takeWhile(i -> i <= 20) |
System.out.println(i); | .forEach(System.out::println) |
🔍 方法说明
🌱 IntStream.iterate(seed, nextFunction)
生成一个无限流(infinite stream),从 seed 开始,每次使用 nextFunction 计算下一个值。
- 示例:
IntStream.iterate(0, i -> i + 3)➜ 生成0, 3, 6, 9...
🛑 takeWhile(predicate)
从流中持续获取元素直到条件不满足为止,相当于函数式的“break”。
- 示例:
takeWhile(i -> i <= 20)➜ 遇到i > 20就停止迭代。
🎯 函数式方式的优势
| 命令式风格 | 函数式风格 |
|---|---|
需要显式写出 break | 用 takeWhile 更加语义清晰 |
| 控制流程分散在多行 | 控制逻辑集中在链式调用中,更易读 |
| 需要手动更新变量值 | 自动计算下一个值,无需维护状态 |
| 容易出错 | 更安全,表达明确 |
💡 延伸示例
📌 示例 1:每隔 4 增加,打印不超过 50 的偶数
IntStream.iterate(0, i -> i + 4)
.takeWhile(i -> i <= 50)
.filter(i -> i % 2 == 0)
.forEach(System.out::println);
🔧 小练习推荐
- 使用
IntStream.iterate()+takeWhile()打印从5开始,每次乘以2,不超过100的数。 - 将以下命令式循环改写为函数式:
for(int i = 10;; i -= 2) {
if(i < 0) break;
System.out.println(i);
}
🧠 培训讲解建议
- 强调:无限流不是危险的,只要你搭配
takeWhile()就能安全使用。 - 类比
while(true) + break,让大家从熟悉场景过渡到函数式。 - 引导大家感受代码意图表达上的提升:函数式更“说明 做什么”,而不是“如何做”。