Java Lambda 表达式详解与经典案例

一、前言

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提供了丰富的函数式接口:

接口参数类型返回值类型示例
PredicateTbooleanx -> x > 5
ConsumerTvoidx -> System.out.println(x)
SupplierT() -> 42
Function<T,R>TRx -> x.toString()
BiFunction<T,U,R>T,UR(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新特性全掌握》等系列内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值