java1.9关键字_对 Java 9 把单个下划线作为关键字的猜想

我们知道 Java 的合法命名是以字母或下划线开头的字符串,当然,以前单个下划线 _ 也是一个合法的变量命名。但是自 Java 8 的第一个版本开始,单个下划线的变量名编译时会有警告

int _ = 99;

用 Java 8 编译时提示警告:

Test.java:2: warning: '_' used as an identifier

int _ = 99;

^

(use of '_' as an identifier might not be supported in releases after Java SE 8)

1 warning

这正是为 Java 9 作的预谋,以一个 LTS 版的 Java 8 作为过渡。因此,来到了 Java 9 后,单个下划线不再担当普通变量名的角色,变成了一个保留关键字,只说是另有任用。

先来看下 Java 9 中的单个下划线变量名编译时的错误提示

Test.java:2: error: as of release 9, '_' is a keyword, and may not be used as an identifier

int _ = 99;

^

1 error

到底单下划线会作为什么用途呢? 已发布的 Java 10 没有给出答案,正在演进中的 Java 11 也没有相关的信息。

于是我对单个下划线的保留功能的猜测,像 Scala 那样可能是要把 _ 用作匿名参数(或者叫做参数点位符)

List("a", "b")

.map(_.toUpperCase + "X")

.foreach(println(_))

1

2

3

List("a","b")

.map(_.toUpperCase+"X")

.foreach(println(_))

上面的 Scala 代码中,_ 代表遍历的元素本身,完整写法是

List("a", "b")

.map(e => e.toUpperCase + "X")

.foreach(e => println(e))

1

2

3

List("a","b")

.map(e=>e.toUpperCase+"X")

.foreach(e=>println(e))

Java 也有一个比 Scala 高级的地方,那就是方法引用。类似的用 Java 的方法引用改写上面的代码

List.of("a", "b")

.map(String::toUpperCase)

.foreach(System.out::println)

1

2

3

List.of("a","b")

.map(String::toUpperCase)

.foreach(System.out::println)

Java 的 Lambda 只能做到这样的了,它的方法引用容不得更多的转换操作。对于

e -> e.toUpperCase() + "X"

//或

e -> System.out.println(e.toSupperCase())

1

2

3

e->e.toUpperCase()+"X"

//或

e->System.out.println(e.toSupperCase())

凡是操作前的参数变化或操作后结果需变化的 Lambda  都无法转换成方法引用。

Groovy 也有类似 Scala 的 _ 用法,只是它用的变量名是 it, 它不完全是 Groovy 的关键字

["a", "b"].forEach {

println(it.toLowerCase())

}

1

2

3

["a","b"].forEach{

println(it.toLowerCase())

}

Scala 除了 Lambda 中用作点位符外,还能用在模式匹配中,类似于 switch..case 语句中的 default 部分。

你可能感兴趣的:(java1.9关键字)