1. 简介

Java 11 中唯一引入的语言特性就是 Lambda 表达式参数支持局部变量语法(Local Variable Syntax)。在本篇文章中,我们将深入探讨并实际使用这一新特性。

2. Lambda 参数的局部变量语法

Java 10 引入了局部变量类型推断,允许我们用 var 来声明局部变量而无需显式指定类型。编译器会根据赋值自动推断出变量的类型。

但在 Java 10 中,这个特性不能用于 Lambda 表达式的参数。比如下面这个 Lambda 表达式:

(String s1, String s2) -> s1 + s2

我们可以省略参数类型写成这样:

(s1, s2) -> s1 + s2

Java 8 就已经支持这种写法。那么自然而然地,在 Java 10 中我们会期待这样的写法也成立:

(var s1, var s2) -> s1 + s2

❌ 然而 Java 10 并不支持这种方式。

✅ Java 11 则正式支持上面这种写法。这使得 var 在局部变量和 Lambda 参数中的使用更加统一。

3. 优势

既然我们可以直接省略参数类型,那为什么还要使用 var 呢?

最主要的原因是:为了统一性和扩展性。当你需要为参数添加注解或其他修饰符时,就必须显式声明类型。例如常见的类型注解:

(@Nonnull var s1, @Nullable var s2) -> s1 + s2

⚠️ 如果你不写类型,就无法加上这些注解。这是使用 var 的一个重要动机。

4. 使用限制

虽然 var 可以让 Lambda 参数更灵活,但它也有一些限制:

  • ❌ 不能部分参数使用 var,部分省略:
(var s1, s2) -> s1 + s2
  • ❌ 也不能混合使用 var 和显式类型:
(var s1, String s2) -> s1 + s2
  • ❌ 即使是单个参数的 Lambda 可以省略括号:
s1 -> s1.toUpperCase()

但一旦用了 var,就不能省略括号:

var s1 -> s1.toUpperCase() // 编译错误!

以上三种写法都会导致编译失败。

5. 总结

在这篇文章中,我们快速了解了 Java 11 中这一简洁又实用的新特性 —— Lambda 参数支持 var 关键字。它不仅增强了语言的一致性,还为我们提供了更大的灵活性,尤其是在需要加注解的时候。

一如既往,文中示例代码可以在 GitHub 上找到。


原始标题:Java 11 Local Variable Syntax for Lambda Parameters