文章目录
- [212. Java 函数式编程风格 - Java 编程风格转换:命令式 vs 函数式(以循环为例)](#212. Java 函数式编程风格 - Java 编程风格转换:命令式 vs 函数式(以循环为例))
-
- [🎯 命令式 vs 函数式编程风格](#🎯 命令式 vs 函数式编程风格)
-
- [✅ 命令式(Imperative)](#✅ 命令式(Imperative))
- [✅ 函数式(Functional / Declarative)](#✅ 函数式(Functional / Declarative))
- [🔄 为什么要从命令式转向函数式?](#🔄 为什么要从命令式转向函数式?)
- [🔁 示例对比:转换常见的循环代码](#🔁 示例对比:转换常见的循环代码)
- [🚀 小技巧:转型建议](#🚀 小技巧:转型建议)
- [🧠 总结:何时用函数式风格?](#🧠 总结:何时用函数式风格?)
212. Java 函数式编程风格 - Java 编程风格转换:命令式 vs 函数式(以循环为例)
🎯 命令式 vs 函数式编程风格
Java
在 8
之前,主要支持的是 面向对象 + 命令式编程 。而从 Java 8 开始,引入了 函数式编程风格(Functional Programming) ,让我们可以使用 lambda
表达式、Stream API
等现代特性来简洁、表达式化地处理数据。
✅ 命令式(Imperative)
- 告诉计算机做什么 ,也要告诉它怎么做。
- 通常是通过显式的
for
或while
循环来完成。 - 比如:拿出列表中的偶数,加
1
,存到新列表中。
java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = new ArrayList<>();
for (int number : numbers) {
if (number % 2 == 0) {
result.add(number + 1);
}
}
System.out.println(result); // [3, 5]
✅ 函数式(Functional / Declarative)
- 告诉计算机做什么 ,但不关心怎么做。
- 借助
Stream API
,使用filter
、map
、collect
等操作。 - 更接近自然语言的描述,可读性高。
java
List<Integer> result = numbers.stream()
.filter(n -> n % 2 == 0)
.map(n -> n + 1)
.collect(Collectors.toList());
System.out.println(result); // [3, 5]
🔄 为什么要从命令式转向函数式?
命令式风格的劣势 🚫 | 函数式风格的优势 ✅ |
---|---|
冗长、嵌套复杂 | 简洁、清晰表达意图 |
代码可读性差 | 更易维护、修改和调试 |
易引入状态错误 | 更少副作用,更安全 |
函数式风格最初看起来可能有点陌生,但一旦掌握,就会发现它更符合人类的表达方式,也更容易组合、调试、并行化。
🔁 示例对比:转换常见的循环代码
🌟 场景一:从列表中取出所有长度> 3
的字符串
命令式版本:
java
List<String> names = Arrays.asList("Tom", "Jerry", "Spike", "Tyke");
List<String> result = new ArrayList<>();
for (String name : names) {
if (name.length() > 3) {
result.add(name);
}
}
System.out.println(result); // [Jerry, Spike]
函数式版本:
java
List<String> result = names.stream()
.filter(name -> name.length() > 3)
.collect(Collectors.toList());
System.out.println(result); // [Jerry, Spike]
🌟 场景二:将所有字符串转换为大写并输出
命令式:
java
for (String name : names) {
System.out.println(name.toUpperCase());
}
函数式:
java
names.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
🌟 场景三:找出第一个长度大于 4
的名字(如果有)
命令式:
java
String result = null;
for (String name : names) {
if (name.length() > 4) {
result = name;
break;
}
}
System.out.println(result); // Spike
函数式:
java
Optional<String> result = names.stream()
.filter(name -> name.length() > 4)
.findFirst();
result.ifPresent(System.out::println); // Spike
🚀 小技巧:转型建议
如果你已经有了命令式的代码,不妨遵循以下步骤来重构为函数式风格:
- 识别循环的目的:是过滤?变换?聚合?
- 查找可替代的 Stream 方法 :如
filter
、map
、reduce
。 - 消除中间变量:尽量用链式调用,保持表达力。
- 保持语义清晰:不要过度压缩代码,避免可读性差。
🧠 总结:何时用函数式风格?
使用函数式风格的最佳时机:
✅ 当你要对集合进行过滤、映射、聚合操作时
✅ 当你希望代码更简洁、更少状态管理
✅ 当你在重构旧代码、修 bug
或加新功能时
使用函数式风格不仅是语法优化,更是思维方式的升级。