Java 8 Lambda 表达式实战应用
Lambda 表达式核心优势
Java 8 引入的 Lambda 表达式极大地简化了函数式编程的写法,使集合操作更简洁、可读性更强。其核心语法为:(参数) -> 表达式,常用于替代匿名内部类。
集合遍历与筛选
传统方式遍历列表需使用 for 循环:
for (String item : items) {
System.out.println(item);
}
使用 Lambda 可以改写为:
items.forEach(System.out::println);
支持条件判断的复杂逻辑:
items.stream()
.filter(s -> s.length() > 1)
.forEach(System.out::println);
Map 遍历与转换
旧式 Map 遍历:
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
使用 Lambda 简化后:
map.forEach((k, v) -> System.out.println(k + " : " + v));
分组与聚合操作
将对象按属性分组:
List<Person> people = ...;
Map<String, List<Person>> grouped = people.stream()
.collect(Collectors.groupingBy(Person::getAddress));
统计每组数量:
Map<String, Long> countMap = people.stream()
.collect(Collectors.groupingBy(Person::getAddress, Collectors.counting()));
List 转 Map 与去重处理
将列表转为 Map,以 ID 为键:
Map<Integer, Person> personMap = people.stream()
.collect(Collectors.toMap(Person::getId, p -> p));
解决键重复问题(使用合并策略):
Map<String, Person> uniqueMap = people.stream()
.collect(Collectors.toMap(
Person::getName,
p -> p,
(existing, replacement) -> replacement // 后者覆盖前者
));
过滤与映射链式操作
从 Map 中筛选特定值并提取结果:
String result = map.entrySet().stream()
.filter(e -> e.getValue().equals("heroku.com"))
.map(Map.Entry::getValue)
.findFirst()
.orElse("Not found");
将多个字段组合成新结构:
List<String> names = employees.stream()
.map(Employee::getName)
.filter(n -> n.startsWith("A"))
.toList();
Optional 安全处理空值
避免空指针异常:
Optional<String> opt = Optional.ofNullable(value);
opt.ifPresent(System.out::println);
System.out.println(opt.orElse("default"));
高级聚合计算
求平均薪资:
OptionalDouble avgSalary = employees.stream()
.mapToDouble(Employee::getSalary)
.average();
获取最高薪资员工:
Optional<Employee> topEmp = employees.stream()
.max(Comparator.comparing(Employee::getSalary));
按薪资降序取前两名:
List<Employee> topTwo = employees.stream()
.sorted(Comparator.comparing(Employee::getSalary).reversed())
.limit(2)
.toList();