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

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











