一、前言
- Java 8 的 Stream API 和 Lambda 表达式 为集合处理带来了函数式编程风格,显著简化了代码并提高了可读性。
二、Lambda 表达式
1.作用
- 简化匿名内部类的语法,允许将函数作为参数传递。
- 实现函数式接口(只有一个抽象方法的接口),如 Runnable、Comparator。
2.示例
Comparator<String> oldComparator = new Comparator<>() {@Overridepublic int compare(String a, String b) {return a.length() - b.length();}
};
Comparator<String> lambdaComparator = (a, b) -> a.length() - b.length();
三、Stream API
1.作用
- 提供声明式数据处理(如过滤、映射、排序、聚合)。
- 支持链式操作(Lazy Evaluation),优化性能。
- 可并行处理(parallelStream())。
四、实际应用场景及代码示例
场景1:筛选+转换
- 需求:从一个用户列表中提取年龄 >18 的用户的邮箱,并按姓名排序。
List<User> users = Arrays.asList(new User("Alice", 20, "alice@example.com"),new User("Bob", 17, "bob@example.com"),new User("Charlie", 25, "charlie@example.com")
);List<String> emails = users.stream().filter(user -> user.getAge() > 18) .sorted(Comparator.comparing(User::getName)) .map(User::getEmail) .collect(Collectors.toList()); System.out.println(emails);
场景2:聚合统计
double averageAge = users.stream().mapToInt(User::getAge) .average() .orElse(0);
System.out.println(averageAge);
场景3:分组与映射
Map<Integer, Long> ageToEmailCount = users.stream().collect(Collectors.groupingBy(User::getAge, Collectors.mapping(User::getEmail, Collectors.counting() )));
System.out.println(ageToEmailCount);
场景4:并行处理
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = numbers.parallelStream() .filter(n -> n % 2 == 0) .mapToInt(Integer::intValue) .sum();
System.out.println(sum);
五、核心优势
- 代码简洁:链式调用替代多层循环和临时变量。
- 可读性强:操作名称(如 filter、map)直接表达意图。
- 性能优化:并行流自动利用多核 CPU。
- 函数式风格:支持更灵活的数据处理逻辑。
六、注意事项
- 副作用:避免在 Lambda 中修改外部变量(应使用不可变数据)。
- 性能:小数据量用 stream(),大数据量用 parallelStream()。
- 资源管理:Stream 是一次性的,终端操作后不能重复使用。
七、总结
- 通过结合 Stream API 和 Lambda,Java 集合处理代码变得更加简洁、高效且易于维护。