Lambda表达式

一、Lambda 表达式

一、Lambda 的核心语法结构

Lambda 的本质是 "接口的匿名实现类",但语法被极大简化。其基本格式为:

java 复制代码
(参数列表) -> { 方法体 }
1. 各部分的含义
  • (参数列表):对应函数式接口中抽象方法的参数(参数类型可省略,Java 会自动推断)。
  • ->:Lambda 运算符(读作 "goes to"),分隔参数和方法体。
  • { 方法体 } :对应抽象方法的实现逻辑(如果方法体只有一行代码,{}和return可以省略)。
二、Lambda 的 "简化规则"(从繁到简)

Lambda 的语法可以根据场景不断简化,以下是逐步简化的示例(以Runnable接口为例,其抽象方法是void run()):

场景:实现Runnable接口
步骤 1:传统匿名内部类(对比用)
java 复制代码
Runnable r = new Runnable() {
    @Override
    public void run() { // 抽象方法
        System.out.println("Hello");
    }
};
步骤 2:Lambda 的 "完整写法"(保留所有元素)
java 复制代码
Runnable r = () -> { // 参数列表为空(因为run()无参)
    System.out.println("Hello");
};
步骤 3:简化方法体(只有一行代码时,省略{})
java 复制代码
Runnable r = () -> System.out.println("Hello");
再看带参数的示例(以Comparator接口为例,抽象方法是int compare(T o1, T o2))
步骤 1:匿名内部类
java 复制代码
Comparator<Integer> c = new Comparator<Integer>() {
    @Override
    public int compare(Integer a, Integer b) {
        return a - b;
    }
};
步骤 2:Lambda 完整写法
java 复制代码
Comparator<Integer> c = (Integer a, Integer b) -> {
    return a - b;
};
步骤 3:简化参数类型(Java 自动推断)
java 复制代码
Comparator<Integer> c = (a, b) -> {
    return a - b;
};
步骤 4:简化方法体(一行代码,省略{}和return)
java 复制代码
Comparator<Integer> c = (a, b) -> a - b;
三、Lambda 的 "适用前提"

Lambda 只能用于 "函数式接口" ,即:只有一个抽象方法的接口 (可用@FunctionalInterface注解标记,强制检查)。

常见的函数式接口:

  • JDK 内置:Runnable、Comparator、Consumer、Function等(位于java.util.function包)。

  • 自定义:

    java 复制代码
    @FunctionalInterface // 可选,但建议加(编译期检查)
    interface MyFunction {
        int add(int a, int b); // 只有一个抽象方法
    }
四、Lambda 的参数 / 方法体细节
1. 参数列表的规则
  • 无参数:用()表示(如() -> ...)。
  • 单个参数:可以省略()(如a -> ...等价于(a) -> ...)。
  • 多个参数:必须用()包裹(如(a, b) -> ...)。
  • 参数类型:可写可不写(Java 会根据接口方法推断)。
2. 方法体的规则
  • 多行代码:必须用{}包裹,且需要显式写return(如果有返回值)。
  • 单行代码:
    • 无返回值:直接写代码(如() -> System.out.println("Hi"))。
    • 有返回值:可以省略{}和return(如(a,b) -> a + b)。
五、Lambda 的实际应用示例
示例 1:遍历集合(结合forEach)
java 复制代码
List<String> list = Arrays.asList("A", "B", "C");
// 用Lambda简化Consumer接口的实现
list.forEach(s -> System.out.println(s));
示例 2:集合排序(结合sort)
java 复制代码
List<Integer> list = Arrays.asList(3, 1, 2);
// 用Lambda简化Comparator接口的实现
list.sort((a, b) -> b - a); // 降序排序
总结 Lambda 的核心逻辑

Lambda 并没有创造新功能,只是用更简洁的语法替代了 "函数式接口的匿名内部类" ,核心是 "省略冗余的类 / 方法声明,只保留核心的参数和逻辑"。

相关推荐
paopaokaka_luck3 分钟前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
码事漫谈15 分钟前
丢得静悄悄,谈一谈 Agent 的记忆是怎么没的
后端
迪飞特科技21 分钟前
智慧物业平台实战:Spring Boot 整合小程序实现报修巡检费用全流程
spring boot·后端·小程序
考虑考虑25 分钟前
@JsonInclude注解使用
spring boot·后端·spring
Wang's Blog30 分钟前
Java 项目实战: 交友项目 - Dubbo 的内部结构与一次调用的完整链路
java·dubbo
Wang's Blog34 分钟前
Java 项目实战: 交友项目 - Dubbo 入门引导
java·dubbo·交友
IT_陈寒1 小时前
Vite的这个问题坑了我三天,原来如此解决!
前端·人工智能·后端
网易云信1 小时前
大模型能上岗做销售吗?我们让 12 款国产模型交了 420 份作业
前端·后端
CCblandy1 小时前
HTTP 长连接 3 类故障实测:[WinError 10053]、99 个 TIME_WAIT、69 次多余握手,4 种对策怎么选
后端·python·网络协议·http·云原生·性能优化·架构
蜗牛互联网1 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python