Java14发布了,有啥新特性呢( 三 )



在之前的发布中,switch表达式只是一个“预览”阶段的特性。我想提醒一下,“预览”阶段的特性的目的是为了收集反馈,这些特性可能会随时改变,根据反馈结果,这些特性甚至可能会被移除,但通常所有的预览特性最后都会在java中固定下来。
新的switch表达式的优点是,不再有缺省跳过行为(fall-through),更全面,而且表达式和组合形式更容易编写,因此出现bug的可能性就更低。例如,switch表达式现在可以使用箭头语法,如下所示:
var log = switch (event) { case PLAY -\u0026gt; "User has triggered the play button"; case STOP, PAUSE -\u0026gt; "User needs a break"; default -\u0026gt; { String message = event.toString(); LocalDateTime now = LocalDateTime.now(); yield "Unknown event " + message + " logged on " + now; }};
二、文本块
Java 13引入的一个预览功能是文本块。有了文本块,多行的字符串字面量就很容易编写了。这个功能在Java 14中进行第二次预览,而且发生了一些变化。例如,多行文本的格式化可能需要编写许多字符串连接操作和转义序列。下面的代码演示了一个HTML的例子:
String html = "\u0026lt;HTML\u0026gt;" +"\\\t" + "\u0026lt;BODY\u0026gt;" +"\\\t\\t" + "\u0026lt;H1\u0026gt;\\"Java 14 is here!\\"\u0026lt;/H1\u0026gt;" +"\\\t" + "\u0026lt;/BODY\u0026gt;" +"\" + "\u0026lt;/HTML\u0026gt;";

有了文本块,就可以简化这一过程,只需使用三引号作为文本块的起始和结束标记,就能编写出更优雅的代码:
String html = """\u0026lt;HTML\u0026gt; \u0026lt;BODY\u0026gt; \u0026lt;H1\u0026gt;"Java 14 is here!"\u0026lt;/H1\u0026gt; \u0026lt;/BODY\u0026gt;\u0026lt;/HTML\u0026gt;""";
与普通字符串字面量相比,文本块的表达性更好。更多的内容可以参考这篇文章 (https://blogs.oracle.com/javamagazine/text-blocks-come-to-java)。
Java 14引入了两个新的转义序列。第一,可以使用新的 \\s 转义序列来表示一个空格。第二,可以使用反斜杠 \\ 来避免在行尾插入换行字符。这样可以很容易地在文本块中将一个很长的行分解成多行来增加可读性。
例如,现在编写多行字符串的方式如下:
String literal = "Lorem ipsum dolor sit amet, consectetur adipiscing " + "elit, sed do eiusmod tempor incididunt ut labore " + "et dolore magna aliqua.";
在文本块中使用 \\ 转义序列,就可以写成这样:
String text = """ Lorem ipsum dolor sit amet, consectetur adipiscing \\ elit, sed do eiusmod tempor incididunt ut labore \\ et dolore magna aliqua.\\ """;
三、instanceof的模式匹配
Java 14引入了一个预览特性,有了它就不再需要编写先通过instanceof判断再强制转换的代码了。例如,下面的代码:
if (obj instanceof Group) { Group group = (Group) obj; // use group specific methods var entries = group.getEntries();}
利用这个预览特性可以重构为:
if (obj instanceof Group group) { var entries = group.getEntries();}
由于条件检查要求obj为Group类型,为什么还要像第一段代码那样在条件代码块中指明obj为Group类型呢?这可能会引发错误。


推荐阅读