0%

Java语言新特性漫谈:Java 11之Lambda表达式声明var形参

本文是《Java语言新特性漫谈》系列文章中的一篇,该系列文章主要探讨各 Java 版本的语言特性方面的增强更新。

var用于Lambda表达式

在 Java 10 中已经加入了基于 var 声明的局部变量类型推断的能力。

Java 11 对这项能力进行了增强,它允许在 Lambda 表达式中使用 var 声明形参。

1
2
3
4
5
6
7
List<String> varInLambda = Arrays.asList("Formal parameter", 
"type inference", "with lambda", null);
String title = list.stream()
.map((var x) -> x.toUpperCase())
.collect(Collectors.joining(" "));

System.out.println(title);

有什么用?

上面的代码,不使用 var 声明变量反而更简洁,甚至括号都可以省略。那么,使用 var 声明有什么好处么?

答案是,如果要给形参加注解,那就不得不为其显式声明类型,或者以 var 声明。例如上面的代码如果要校验参数不能为空,则:

1
2
3
4
5
6
7
8
9
import org.jetbrains.annotations.NotNull;

List<String> varInLambda = Arrays.asList("Formal parameter",
"type inference", "with lambda", null);
String title = list.stream()
.map((@NotNull var x) -> x.toUpperCase())
.collect(Collectors.joining(" "));

System.out.println(title);

限制条件

不过,需要注意的是,在 Lambda 表达式中使用 var 声明形参是有限制的,简单的一句话:
要用 var 就所有参数都用,不能混用。

因此,以下形式的混用都是不合法的:

1
2
(var x, y) -> x.process(y)
(var x, int y) -> x.process(y)

(完)