Java中Lambda / Stream详解
🔥 一、Lambda 是什么?(核心概念)
根据资料 LabEx与 DEV Community:
Lambda 是 Java 8 引入的匿名函数,用来简化只有一个抽象方法的接口(函数式接口)的写法。
换句话说:
Lambda = 更简洁的函数写法
Lambda = 传递行为(函数)而不是传递对象
📌 Lambda 的基本语法
java
(parameters) -> expression
(parameters) -> { statements }
📌 示例:传统写法 vs Lambda
传统写法(匿名类)
java
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
}).start();
Lambda 写法
java
new Thread(() -> System.out.println("Hello")).start();
更短、更清晰。
🔥 二、Lambda 的本质:函数式接口
资料 DEV Community指出:
Lambda 必须依附于"函数式接口"(只包含一个抽象方法的接口)。
常见函数式接口:
RunnableCallableComparatorPredicate<T>Function<T,R>Consumer<T>Supplier<T>
示例:
java
Predicate<Integer> isEven = n -> n % 2 == 0;
🔥 三、Stream 是什么?(核心概念)
根据资料 LabEx Baeldung Stack Abuse:
Stream 是对集合进行声明式(非命令式)处理的 API,支持链式操作、并行处理、惰性求值。
Stream 不是集合,它不存储数据,只是数据的"流水线"。
🔥 四、Stream 的三大步骤
资料 Baeldung指出 Stream 的典型结构:
1️⃣ 创建 Stream
java
List<Integer> list = List.of(1,2,3);
Stream<Integer> s = list.stream();
2️⃣ 中间操作(返回 Stream)
filtermapsorteddistinctlimitskip
3️⃣ 终止操作(返回结果)
collectforEachreducecountfindFirst
🔥 五、Lambda + Stream 实战详解
⭐ 1. filter(过滤)
资料 LabEx Baeldung Stack Abuse都强调 filter 是最常用的操作。
java
List<Integer> nums = List.of(1,2,3,4,5,6);
List<Integer> even = nums.stream()
.filter(n -> n % 2 == 0)
.toList();
⭐ 2. map(映射)
把一个值转换成另一个值。
java
List<String> names = List.of("a", "bb", "ccc");
List<Integer> lengths = names.stream()
.map(s -> s.length())
.toList();
⭐ 3. sorted(排序)
java
List<Integer> sorted = nums.stream()
.sorted((a,b) -> b - a)
.toList();
⭐ 4. reduce(聚合)
java
int sum = nums.stream()
.reduce(0, (a,b) -> a + b);
⭐ 5. collect(收集)
java
List<String> upper = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
🔥 六、Stream 的特性(必须掌握)
1️⃣ 惰性求值(Lazy Evaluation)
中间操作不会立即执行,只有终止操作才会触发。
2️⃣ 不修改原集合(函数式思想)
Stream 是不可变的。
3️⃣ 可并行(parallelStream)
java
list.parallelStream()
.filter(...)
.map(...)
.toList();
🔥 七、Lambda 与 Stream 的最佳实践(来自资料 Java Guides)
✔ 写法简洁但不要过度链式
避免一行写 10 个操作,可读性会变差。
✔ 避免在 Stream 中写复杂逻辑
Stream 适合"数据转换",不适合复杂业务。
✔ 优先使用方法引用(更清晰)
java
list.stream().map(String::toUpperCase)
✔ 不要滥用 parallelStream
并行流适合 CPU 密集型任务,不适合 IO。
🔥 八、完整示例:从集合到结果的全流程
java
List<String> names = List.of("Alice", "Bob", "Charlie", "David");
List<String> result = names.stream()
.filter(n -> n.length() > 3) // 过滤
.map(String::toUpperCase) // 转换
.sorted() // 排序
.toList(); // 收集
输出:
[Alice, Charlie, David] → [ALICE, CHARLIE, DAVID]
📚 引用来源
- LabExLabEx:Java Lambda 与 Stream 过滤教程
- DEV CommunityDev.to:Lambda、函数式接口、Stream 深度解析
- BaeldungBaeldung:Stream.filter 使用指南
- Stack AbuseStackAbuse:Stream + Lambda 过滤示例