前言
Oracle 官方宣称在每年的三月和九月将分别发布两次 Java 的新版本。这意味着 Java 11 将在五个月内面世。得益于如此频繁的发布速度,只要有新功能便会立即加入到新版的 Java 中,这样一来开发者就可以很快享有 Java 的新功能,而不必再像以前那样等待多年。
Java 10的发布相比于 Java 9 只有短短的六个月,然而我们在 Java 10中看到了大量的新功能。对于即将发布的 Java 11,我们同样期待能够有更多的新功能加入。
如今,这些新功能能够快速在 Java 新版本中发布,那么这些新功能到底有哪些?本文将重点介绍当前正在开发和提及的一些有趣的 Java 新功能。
新特性介绍
局部变量类型推断
Java 10 引入了局部变量类型推断的特性。该特性使用var关键字来定义局部变量,并让编译器根据初始化的方式来确定变量类型。如果你使用过 Java 的 lambda 表达式,那么这个特性对你来说并不会太陌生。
实际上,使用过lambda表达式的你可能已经耳熟能详了:
Function<String, String> foo = (s) -> s.toLowerCase();
上面这段代码你会发现没有必要把 s 定义为 String,它的类型会由编译器自动推断出来。使用 Java 10,你可以编写如下代码:
var list = new ArrayList<String>();
编译器会推断 list 是 ArrayList 类型。使用 var关键字可以帮助你减少一些代码的冗长度,尤其是泛型已经存在于变量初始化或者变量名称中时。它容易获得且易于理解,不必依靠 IDE 来告诉你变量的具体类型。
Java 11会进一步增强这一点,所以var也是 lambda 参数的合法类型,这意味着前面提到的 lambda 也可以写成 (var s) -> s.toLowerCase();。你可能会问为什么可以这么写,实际上,忽略类型的效果是一样的。一个主要的原因是,有一个类型的话意味着你可以注释得更好。
具体哪些情况应该使用var,请阅读:http://openjdk.java.net/projects/amber/LVTIstyle.html
原始字符串
目前另一项增强功能被提出并正在积极研究中,那就是原始字符串文字功能。在原始字符串中,字符串中的每个字符都按原样读取,包括换行符!这个功能对于那些需要大量转义或者跨越多行的字符串来说特别有用。例如,这可以是硬编码的 HTML 或 SQL 查询:
String html = "<html>\n" +
             "  <body>\n" +
             "    <p>Hello World.</p>\n" +
             "  </body>\n" +
             "</html>\n";
有了原始字符串文字特性,以上代码可以写成这样:
String html = `<html>
                <body>
                  <p>Hello World.</p>
                </body>
              </html>
             `;
在新的语法中当,反引号(`)用作原始字符串符号。如果你需要在字符串文本中使用反引号,则只需使用双反引号将字符串包围起来,或者三元、四元反引号也可以,只要开始和结束的反引号数量相同即可。
swich表达式
有关 switch 语句的多项改进正在进行,其中就包括了全开模式匹配。我对 switch 表达式充满期待。如果你曾经写过 switch 语句,那么代码可能是这样的:
int val;
switch (str) {
  case "foo": val = 1; break;
  case "bar": val = 2; break;
  case "baz": val = 3; break;
  default: val = -1;
}
有了 switch 表达式,上面的代码可以简化为:
int val = switch (str) {
  case "foo": break 1;
  case "bar": break 2;
  case "baz": break 3;
  default: break -1;
}
这意味着 break 语句能够获得 switch 表达式的结果值,就像 return 获得方法的返回值一样。在以上例子中,break 是 case 的唯一语句,如果继续简化,一种类似 lambda 语法的写法可以将上述代码改为:
int val = switch (str) {
  case "foo" -> 1;
  case "bar" -> 2;
  case "baz" -> 3;
  default -> -1;
}
如上所述,添加 switch 表达式是模式匹配的一个步骤,它使你不仅能够切换编译时常量,还可以是类型、条件检查等等。
目前 switch 表达式已经实现了,经过测试、代码审查和批准之后,相信将其发布到 JDK 中只是一个时间问题。离 Java 11发布还有足够长的时间,在 Java 11中加入 switch 表达式应该没问题。
其他特性
除了上述提到的语言变化之外,还有很多其他的东西可能在近期或者不远的将来出现在 Java 的新版本中。JEP 的提案越来越多,比如支持枚举泛型类型参数的增强枚举、前文已经提到的模式匹配、动态调用、值类型,等等。
如何将单个文件类作为脚本启动,类似于shell、Perl 或者 Python 脚本在命令行的运行方式一样?Java 后台引擎也进行了很多改进。这包括对 JVM 本身的更改,这样的更改对语言层面不会有影响,例如新的超低延迟 GC,用于与本机代码更好地实现互操作性的 API,改变内部类在 JVM 级别(基于嵌套的访问控制)以及一些其他的改进。
 菡萏如佳人
菡萏如佳人