Lambda 表达式是将可执行行为作为一等公民传递给方法,必须赋值给函数式接口(仅一个抽象方法),形参与返回值需严格匹配接口方法签名,可直接传参、赋值变量或作为返回值,执行时机由接收方控制。

Java 中 Lambda 表达式传递代码逻辑到方法参数,本质是把一段可执行行为(而不是值或字符串)作为“一等公民”传入方法。它不是把 method(a, b) 这种调用写成字符串存起来,而是直接封装已绑定上下文的执行逻辑,由接收方在合适时机调用。
必须基于函数式接口
Lambda 只能赋值给**只有一个抽象方法的接口(函数式接口)**,编译器靠这个识别语义。Java 自带的如 Runnable、Consumer<T>、Function<T,R> 都是现成选择;你也可以自定义:
- 加
@FunctionalInterface注解,防止误增方法 - 接口中只能有一个未实现的抽象方法(默认方法、静态方法不限制)
- 方法签名(参数类型、个数、返回值)决定 Lambda 的写法形式
参数匹配要严格对齐
Lambda 的形参列表必须和函数式接口中那个抽象方法的声明完全一致——类型、顺序、数量都不能错。例如:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
Consumer<String>对应(String s) -> System.out.println(s)或简写为s -> System.out.println(s) -
Function<Integer, Boolean>对应x -> x > 0(自动推断x是Integer) - 如果方法需要两个
int参数并返回int,就得用(a, b) -> a + b,不能少参数也不能写成a -> a + 1
传入方式就是直接当参数写
调用方法时,把 Lambda 写在实参位置,和普通变量传参一样自然:
立即学习“Java免费学习笔记(深入)”;
- 比如
list.forEach(item -> process(item)),item -> process(item)就是传给forEach的逻辑 - 也可以先赋值给变量再传:
BiFunction<String, Integer, String> formatter = (s, len) -> s.substring(0, len); method(formatter); - 甚至可以作为方法返回值:一个方法内部构造好 Lambda 并 return,调用方拿到后随时执行
执行时机由接收方控制
Lambda 本身不运行,只是“准备好了一段逻辑”。真正触发执行,取决于方法内部怎么调用那个函数式接口的抽象方法:
- 像
forEach是立即遍历执行 - 像
supplyAsync是提交到线程池异步执行 - 像
spinServerUp()返回的Await实例,要等外部调用await(...)才真正阻塞等待

















