原文:Java 11 Local Variable Syntax for Lambda Parameters
1. 介绍
Lambda参数的局部变量语法是Java 11引入的唯一个语言特性。本文我们将一起探索这个新特性。
2. Lambda参数的局部变量语法
Java 10引入的一个关键特性之一为局部变量类型推断:Java 10 LocalVariable Type-Inference,允许用var作为局部变量的类型。编译器根据分配给变量的值推断类型。
然而,我们并不能在lambda表达式上应用这个特性。比如,我们明确声明两个参数的类型:
(String s1, String s2) -> s1 + s2
我们可以省略参数的类型,重新写一下这个lambda:
(s1, s2) -> s1 + s2
Java8是支持这种写法的。Java 10逻辑扩展为:
(var s1, var s2) -> s1 + s2
但Java 10并不支持这种写法。
Java 11支持上述所有语法。这使得var在局部变量和lambda参数中的使用是一致的。
3. 优点
如果lambda能省略掉参数类型,为什么还要用var呢?
其中一个好处就是修饰符可以应用于局部变量和lambda表达式,而不会失去简洁性。
比如,常见的一个修饰符:类型注解:
(@Nonnull var s1, @Nullable var s2) -> s1 + s2
这样我们可以不用特别声明类型就可以使用注解。
4.局限
在lambda中使用var也有一些局限性。
比如,1、不能一个参数用var,一个参数省略类型:
// 错误❌
(var s1, s2) -> s1 + s2
2、不能将特定的类型和var混合使用:
// 错误❌
(var s1, String s2) -> s1 + s2
3、一个参数的lambda表达式,省略参数的话我们可以不用括号:
s1 -> s1.toUpperCase()
用var的话不能省略括号:
// 错误❌
var s1 -> s1.toUpperCase()
以上3种用法会导致编译错误。
5. 总结
本文我们探索了Java11的一个新特性:如何用Lambda参数的局部变量语法