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