java数组遍历体现命令式(强调执行步骤)与函数式(聚焦结果意图)两种思维:前者用for循环手动管理状态,后者通过stream api链式声明操作;选择取决于场景、可读性与维护成本。

Java 中数组遍历的写法,本质上反映了两种不同的编程思维:命令式强调“怎么走”,函数式聚焦“要什么结果”。选哪种不取决于对错,而在于场景、可读性与维护成本。
命令式遍历:控制每一步执行
它用显式循环和状态变量描述过程,像手把手教机器干活。
- 典型写法是 for 或 for-each,需手动管理索引或迭代器
- 中间状态(如临时集合、累加器)必须显式声明并反复修改
- 逻辑耦合度高——过滤、映射、聚合常混在同一段循环里
- 例子:求偶数平方和
for (int x : arr) {
if (x % 2 == 0) sum += x * x;
}
函数式遍历:声明数据转换意图
它把数组看作不可变数据流,通过链式操作表达“我要偶数→再平方→再求和”这个意图,不暴露底层步骤。
- 依赖 Stream API(如
filter、map、reduce),每个操作返回新流,原数组不变 - 无显式循环和中间变量,副作用被天然隔离
- 天然支持并行:
.parallelStream()只需改一个词,无需重写逻辑 - 例子:同样求偶数平方和
.filter(x -> x % 2 == 0)
.map(x -> x * x)
.sum();
什么时候该用命令式
并非函数式一定更优。以下情况命令式更直接:
- 需要精确控制执行顺序或提前中断(如找到首个匹配项就 break)
- 遍历中需访问数组下标(如比较相邻元素)
- 性能极度敏感且已确认 Stream 开销不可接受(小数组、高频调用)
- 团队普遍不熟悉函数式语法,维护成本反而上升
函数式不是银弹,但改变了协作方式
它让代码重心从“怎么写循环”转向“怎么定义业务规则”。比如把 filter(x -> x > 0) 抽成独立方法 isPositive(),逻辑可复用、可测试、可组合。而命令式代码一旦嵌套三层 if+for,就容易变成“意大利面”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











