一、前言
Java 8引入的Lambda表达式为Java带来了函数式编程能力,不仅简化了代码编写,还提升了集合处理效率。掌握Lambda表达式已成为Java开发者必备的核心技能。
本文将全面解析Lambda表达式,从基础语法到函数式接口,并通过十个经典案例展示其实战应用。
二、Lambda表达式基础
Lambda表达式是一种简化匿名内部类的语法结构,可将行为作为参数传递给方法。
基本语法格式:
(parameters) -> expression
(parameters) -> { statements }
对比示例:
传统写法:
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Hello Lambda");
}
};
Lambda写法:
Runnable r = () -> System.out.println("Hello Lambda");
三、常见函数式接口
Java 8提供了丰富的函数式接口:
接口 | 参数类型 | 返回值类型 | 示例 |
---|---|---|---|
Predicate | T | boolean | x -> x > 5 |
Consumer | T | void | x -> System.out.println(x) |
Supplier | 无 | T | () -> 42 |
Function<T,R> | T | R | x -> x.toString() |
BiFunction<T,U,R> | T,U | R | (a, b) -> a + b |
四、十大实战案例
案例1:集合排序
List<String> names = Arrays.asList("Tom", "Jerry", "Alice");
names.sort((a, b) -> a.compareTo(b));
// 更简洁的写法
names.sort(String::compareTo);
案例2:遍历打印
names.forEach(name -> System.out.println(name));
// 方法引用
names.forEach(System.out::println);
案例3:数据过滤
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> even = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
案例4:字符串转换
List<String> upper = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
案例5:数值计算
int sum = numbers.stream().mapToInt(i -> i).sum();
double avg = numbers.stream().mapToInt(i -> i).average().orElse(0);
案例6:分组统计
Map<Integer, List<String>> grouped = names.stream()
.collect(Collectors.groupingBy(String::length));
案例7:对象创建
Supplier<List<String>> listSupplier = ArrayList::new;
List<String> list = listSupplier.get();
案例8:自定义接口
@FunctionalInterface
interface GreetingService {
void greet(String message);
}
public void sayHello(GreetingService service) {
service.greet("Hello Lambda");
}
sayHello(msg -> System.out.println("Message: " + msg));
案例9:对象过滤
List<User> users = Arrays.asList(
new User("Tom", 20),
new User("Jerry", 25)
);
List<User> adults = users.stream()
.filter(user -> user.getAge() >= 21)
.collect(Collectors.toList());
案例10:多条件排序
users.sort(Comparator
.comparing(User::getAge)
.thenComparing(User::getName));
五、方法引用
语法形式:
- ClassName::staticMethod
- object::instanceMethod
- ClassName::instanceMethod
- ClassName::new(构造引用)
示例:
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(System.out::println);
六、使用建议
✅ 最佳实践:
- 简单行为逻辑优先使用Lambda
- 结合Stream API高效处理集合
- 复杂逻辑适当拆分,避免多层嵌套
⚠️ 注意事项:
- 避免编写过长、可读性差的Lambda
- 谨慎使用嵌套Lambda
- 理解底层机制后再使用流式操作
七、总结
Lambda表达式是提升Java代码简洁性和开发效率的重要特性,尤其适用于集合操作和行为参数化场景。与Stream API和方法引用配合使用效果更佳。
八、完整示例代码
public class LambdaDemo {
public static void main(String[] args) {
List<String> names = Arrays.asList("Tom", "Jerry", "Alice", "Bob");
// 排序
names.sort(String::compareTo);
// 遍历
names.forEach(System.out::println);
// 转大写
List<String> upper = names.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
// 自定义接口
greet(msg -> System.out.println("Hello, " + msg));
// 用户过滤
List<User> users = Arrays.asList(new User("A", 18), new User("B", 25));
List<User> adults = users.stream().filter(u -> u.getAge() >= 21).collect(Collectors.toList());
adults.forEach(u -> System.out.println(u.getName()));
}
@FunctionalInterface
interface Greeting {
void say(String message);
}
public static void greet(Greeting greeting) {
greeting.say("Lambda");
}
static class User {
private final String name;
private final int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() { return name; }
public int getAge() { return age; }
}
}
九、进阶学习方向
- Stream API的中间与终止操作
- 函数式接口原理与自定义
- 结合Optional使用
- 并行流与性能优化
如果本文对您有帮助,欢迎点赞、收藏、关注,后续将推出《Stream API深度解析》、《Java 8新特性全掌握》等系列内容。