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. 根据参数个数和代码行数,应用省略规则。

相关推荐
AI你一生一世14 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
布莱克60514 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
云-缩影14 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
LabVIEW开发14 小时前
LabVIEW 局部变量为何引发竞争条件?四种同步机制
开发语言·labview
瑞克-桑切斯14 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
benchmark_cc15 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
前进的李工16 小时前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
Zenova EdgeOS16 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
取名真是16 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
FRing0316 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2