Lambda 和 Stream API
掌握 Lambda 表达式的语法与使用场景
理解函数式接口的概念
能用 Stream API 处理集合数据
核心讲解
(1)Lambda 表达式
Java 8 引入,用来简化匿名内部类,只保留参数和方法体。
语法:
(参数) -> { 方法体 }前提:必须是函数式接口(只有一个抽象方法的接口)
简化:
参数类型可以省略
一个参数可以省略括号
方法体只有一句可以省略大括号和 return
(2)常用函数式接口
Runnable:无参数无返回Supplier<T>:无参数,返回值Consumer<T>:一个参数,无返回Function<T,R>:一个参数一个返回值Predicate<T>:一个参数,返回 boolean
(3)Stream API
用来处理集合数据,像流水线一样,链式调用,简洁高效。
创建流:
集合.stream()中间操作:
filter过滤、map转换、sorted排序、distinct去重终结操作:
forEach遍历、collect收集、count计数、max/min最值
代码示例
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class LambdaStreamDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("张三丰");
// ===== Lambda 遍历 =====
// 匿名内部类写法
list.forEach(s -> System.out.println(s));
// 方法引用
list.forEach(System.out::println);
// ===== Stream 处理 =====
List<String> result = list.stream()
.filter(s -> s.length() == 2) // 过滤两个字的名字
.map(s -> "姓名:" + s) // 拼接
.sorted() // 排序
.collect(Collectors.toList()); // 收集成列表
System.out.println("处理结果:" + result);
// 计算数字流
List<Integer> nums = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = nums.stream()
.filter(n -> n % 2 == 0) // 过滤偶数
.mapToInt(n -> n * 2) // 乘2
.sum(); // 求和
System.out.println("偶数乘2求和:" + sum);
// ===== Runnable Lambda =====
new Thread(() -> System.out.println("线程运行了")).start();
}
}
常见误区
Lambda 里面修改外部变量:Lambda 只能访问 final 或事实上 final 的外部变量,不能修改
Stream 可以重复用:流只能用一次,用完就关了,要重新创建
中间操作不执行:只有终结操作执行时,中间操作才会执行,这叫惰性求值
所有场景都用 Stream:简单循环不用强行用 Stream,复杂集合处理才适合
课后练习
用 Lambda 和 forEach 遍历一个整数列表
用 Stream 过滤出列表中大于 5 的数字,平方后收集成新列表
用 Stream 找出字符串列表中最长的字符串
思考:Lambda 和匿名内部类相比有什么优势?

