java中lambda表达式参数类型可省略,前提是编译器能根据目标函数式接口方法签名准确推断类型;常见场景包括方法参数声明函数式接口、泛型变量声明、stream操作等,且必须全部省略或全部写出,不可部分省略。

Java 中 Lambda 表达式的参数类型可以省略,前提是编译器能根据上下文(主要是目标函数式接口的方法签名)准确推断出每个参数的类型。这不是随意省略,而是依赖类型推断机制。
参数类型省略的前提是存在明确的函数式接口类型
比如你把 Lambda 传给 Comparator<string>.compare()</string> 方法,编译器就知道第一个参数是 String,第二个也是 String,所以 (String s1, String s2) -> s1.length() - s2.length() 可以简化为 (s1, s2) -> s1.length() - s2.length()。
能省略的几种常见情况
方法参数声明了函数式接口类型,例如:
Arrays.sort(arr, (a, b) -> a - b);
这里arr是int[],Arrays.sort(int[], IntComparator)的重载不适用,实际调用的是Arrays.sort(T[], Comparator super T>),但若arr是Integer[],那么T就是Integer,Comparator<integer></integer>的compare(Integer, Integer)就让a和b被推断为Integer,类型自然可省。使用泛型方法或变量声明提供类型信息,例如:
Function<string integer> f = s -> s.length();</string>
左边已声明Function<string integer></string>,其apply(String)方法说明参数必为String,所以s的类型可省。在 Stream 操作中,如:
list.stream().map(s -> s.toUpperCase())
若list是List<string></string>,那map的入参类型就是Function<string r></string>,s就被推断为String。
不能只省部分参数类型(String x, y) -> x + y 是非法的——要么全写 (String x, String y),要么全省 (x, y)。多个参数时,类型必须统一省略。
只有一个参数时,括号也可省,进一步简化list.forEach(s -> System.out.println(s))
等价于 list.forEach((String s) -> System.out.println(s)),也等价于 list.forEach(s -> System.out.println(s))(括号和类型都省了)。
只要上下文足够清晰,Java 编译器就能安全省掉类型声明,代码更简洁,又不损失类型安全。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











