为何要为Lambda参数使用局部变量类型推断?明明可省略该语法
Java 11 Lambda参数局部变量类型推断的使用场景
Java 11引入了Lambda参数的局部变量类型推断,示例代码如下:
Stream.of("a", "b", "c").map((var a) -> "ok")
很多人会疑惑:既然可以直接省略var,写成更简洁的形式,为什么还要用这个语法?
Stream.of("a", "b", "c").map(a -> "ok")
其实var在Lambda参数里有几个实用的场景:
为参数添加注解:如果需要给Lambda参数加注解(比如空校验、自定义注解),必须显式声明参数的类型或使用
var,直接写注解加参数名是不合法的。比如:// 合法:用var配合注解 Stream.of("a", "b", "c").map((@Nonnull var a) -> a.toUpperCase()) // 合法:用具体类型配合注解 Stream.of("a", "b", "c").map((@Nonnull String a) -> a.toUpperCase()) // 不合法:无法直接给参数a加注解 // Stream.of("a", "b", "c").map((@Nonnull a) -> a.toUpperCase())这种场景下,
var既保留了类型推断的简洁性,又能满足添加注解的需求。提升代码可读性:在一些复杂的泛型场景或链式调用中,Lambda参数的类型可能不容易从上下文快速判断出来。加上
var可以明确这里是通过类型推断获取参数类型,同时让代码阅读者清晰感知到参数的存在,尤其是当Lambda有多个参数时,统一使用var能让参数列表更规整。比如:// 复杂泛型场景,var让参数类型的推断意图更明确 Map<String, List<Map<Integer, String>>> complexMap = new HashMap<>(); complexMap.forEach((var key, var value) -> { // 处理逻辑 });保持代码风格一致性:如果项目中已经大量使用
var声明局部变量(比如var list = new ArrayList<>();),那么在Lambda参数中使用var可以让整个代码的类型推断写法保持统一,风格更协调。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

