java中lambda表达式可作为方法参数传递,前提是参数类型为函数式接口;编译器自动将其转为接口实例,常用jdk内置接口如predicate、function等,并支持类型推断与语法简化。

Java 中可以把 Lambda 表达式作为方法参数传递,前提是该参数的类型是一个函数式接口(即只含一个抽象方法的接口)。Lambda 本质是函数式接口的实例,编译器会自动将其转换为对应接口的实现对象。
1. 确保参数类型是函数式接口
函数式接口需用 @FunctionalInterface 标注(非强制但推荐),例如:
@FunctionalInterface<br>interface Calculator {<br> int compute(int a, int b);<br>}
这样,方法就可以声明形如 void doCalc(Calculator calc) 的参数,然后传入 Lambda:
doCalc((a, b) -> a + b); // 传入加法逻辑
2. 直接使用 JDK 内置函数式接口更常见
不必每次都自定义接口,JDK 提供了丰富的内置函数式接口,按场景选用:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
无参无返回:用
Runnable→run(() -> System.out.println("Hello")) -
单参无返回:用
Consumer<t></t>→forEach(list, item -> System.out.println(item)) -
单参有返回:用
Function<t r></t>→map(list, s -> s.length()) -
双参有返回:用
BiFunction<t u r></t>→reduce(data, (acc, x) -> acc + x) -
返回 boolean:用
Predicate<t></t>→filter(list, s -> s.startsWith("A"))
3. 方法定义要明确接受函数式接口类型
例如写一个通用的过滤方法:
public static <t> List<t> filter(List<t> list, Predicate<t> condition) {<br> List<t> result = new ArrayList();<br> for (T item : list) {<br> if (condition.test(item)) {<br> result.add(item);<br> }<br> }<br> return result;<br>}</t></t></t></t></t>
调用时直接传 Lambda:
List<string> names = Arrays.asList("Alice", "Bob", "Anna");<br>List<string> startsWithA = filter(names, s -> s.charAt(0) == 'A');</string></string>
4. 注意类型推断和括号省略规则
Lambda 表达式在上下文明确时可简化:
- 单个参数可省括号:
s -> s.length()等价于(s) -> s.length() - 单条语句可省大括号和
return:(a, b) -> a * b - 多语句必须加大括号并显式
return:(a, b) -> { return a > b ? a : b; }
若编译器无法推断类型(如重载方法或泛型擦除),需显式转型或使用变量暂存。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










