Java Lambda 表达式

1. 核心前提:什么时候能用?

只有在"函数式接口"作为参数时,才能使用 Lambda 表达式。

什么是函数式接口?

  • 定义 :有且仅有一个抽象方法的接口。

  • 特征 :通常(但不强制)类上会有 @FunctionalInterface 注解。

  • 原理 :编译器通过上下文推断,将 Lambda 表达式自动映射到那唯一的一个抽象方法上。

判断标准:

java 复制代码
//  是函数式接口 (只有一个抽象方法 swimming)
@FunctionalInterface
interface Swim {
    void swimming();
}

//  不是函数式接口 (有两个抽象方法)
interface Run {
    void fastRun();
    void slowRun();
}

2. 语法格式

标准格式:(参数列表) -> { 方法体 }

省略规则(重点)

为了简洁,Java 允许在特定情况下省略语法元素:

  1. 参数类型:可以不写,编译器自动推断。

    • (String s) -> ... 可简化为 (s) -> ...
  2. 小括号 :如果只有一个参数,小括号可以省略。

    • (s) -> ... 可简化为 s -> ...
  3. 大括号与分号 :如果方法体只有一行代码 ,大括号 {}、分号 ;return 关键字都可以省略。

    • (x, y) -> { return x + y; } 可简化为 (x, y) -> x + y

3. 代码解析:

接口定义

java 复制代码
@FunctionalInterface
interface Swim {
    // 唯一的抽象方法:无参数,无返回值
    public abstract void swimming();
}

写法对比

写法一:匿名内部类(旧)

编译器看到这里,实际上创建了一个 Swim 的实现对象。

java 复制代码
methed(new Swim() {
    @Override
    public void swimming() {
        System.out.println("Swiming");
    }
});

写法二:Lambda 表达式(新)

编译器发现 methed 接收 Swim 接口,且 Swim 只有一个 swimming() 方法,于是直接把 {} 里的代码填入 swimming() 方法中。

java 复制代码
// 标准写法
methed(() -> {
    System.out.println("Swiming");
});

// 极致简化(因为只有一行代码)
methed(() -> System.out.println("Swiming"));

4. 更多场景举例

根据接口方法的不同(有无参数、有无返回值),Lambda 的写法会有变化。

场景 A:有参数,无返回值

假设接口是:void handle(String msg);

java 复制代码
// 完整写法
consumer((String msg) -> {
    System.out.println("处理消息: " + msg);
});

// 简化写法 (省略类型、小括号、大括号)
consumer(msg -> System.out.println("处理消息: " + msg));

场景 B:有参数,有返回值

假设接口是:int add(int a, int b);

java 复制代码
// 完整写法
calculator((int a, int b) -> {
    return a + b;
});

// 简化写法 (省略类型、大括号、return)
// 注意:如果省略大括号,必须同时省略 return
calculator((a, b) -> a + b);

5. 总结

  1. 看到方法参数是 接口

  2. 检查该接口是否只有一个抽象方法

  3. 如果是,直接写 () -> {}

  4. 根据参数个数和代码行数,应用省略规则

相关推荐
折哥的程序人生 · 物流技术专研8 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
千寻xun8 小时前
一、理论篇-NVME协议学习笔记
笔记·学习·fpga开发·nvme ssd·nvme协议
researcher-Jiang8 小时前
高性能计算之OpenMP——超算习堂学习1
android·java·学习
西门吹-禅10 小时前
java springboot N+1问题
java·开发语言·spring boot
DLYSB_10 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
skywalk816310 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程
weixin_BYSJ198710 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
AI小码11 小时前
LLM 应用的缓存工程:当每次 API 调用都在燃烧成本
java·人工智能·spring·计算机·llm·编程·api
Hui Baby11 小时前
Spring Security
java·后端·spring
IT笔记12 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust