十分钟从Java 8到Java 15( 二 )


使用var进行类型推断(Java 10)Java 10引入了新的var关键字 , 该关键字允许省略变量的类型 。
jshell> var x = new HashSet<String>()x ==> []jshell> x.add("Apple")$1 ==> true在上面的代码段中 , 编译器可以将x的类型推断为HashSet 。
此功能有助于减少样板代码并提高可读性 。不过 , 它有一些限制:您只能在方法主体内部使用var , 并且编译器会在编译时推断类型 , 因此所有内容仍为静态类型 。
单一源文件启动(Java 11)以前 , 编写一个包含一个文件的简单Java程序时 , 必须首先使用javac编译该文件 , 然后使用Java运行它 。在Java 11中 , 您可以使用一个命令完成两个步骤 。
首先 , 定义单个源文件Main.java:
public class Main {public static void main(String[] args) {System.out.println("hello world");}}现在 , 您可以一步编译并运行它:
$ java ./Main.javahello world对于仅由一个Java类组成的简单启动程序或实验 , 此用于启动单个源文件的功能将使您的生活更轻松 。
Switch 表达式(Java 12)Java 12为我们带来了Switch表达式 。快速展示了该表达式与旧的switch语句有何不同 。
旧的switch语句定义程序的流程:
jshell> var i = 3jshell> String s;jshell> switch(i) {...>case 1: s = "one"; break;...>case 2: s = "two"; break;...>case 3: s = "three"; break;...>default: s = "unknown number";...> }jshell> ss ==> "three"相反 , 新的switch表达式返回一个值:
jshell> var i = 3;jshell> var x = switch(i) {...>case 1 -> "one";...>case 2 -> "two";...>case 3 -> "three";...>default -> "unknown number";...> };x ==> "three"总而言之 , 旧的switch语句用于程序流 , 新的switch表达式解析为一个值 。
请注意 , 这个新的switch语句是一种映射功能:只有一个输入(在上述情况下为i) , 而只有一个输出(此处为x) 。实际上 , 这是一种模式匹配功能 , 有助于使Java与函数编程原理更加兼容 。类似的switch语句在Scala中已有一段时间了 。
需要注意的几件事:

  • 代替双点 , 我们使用箭头->
  • 无需Break
  • 当考虑所有可能的情况时 , 可以省略默认情况
  • 要在Java 12中启用此功能 , 请使用–enable-preview –source 12
多行字符串(Java 13)您是否曾经定义过长的多行字符串 , 例如JSON或XML?到目前为止 , 您可能已经将所有内容都压缩了一行并使用换行符 n , 但这使String更加难以阅读 。Java 13带有多行字符串!
样例:
public class Main {public static void main(String [] args) {var s = """{"recipe": "watermelon smoothie","duration": "10 mins","items": ["watermelon", "lemon", "parsley"]}""";System.out.println(s);}}现在 , 我们通过单文件启动运行main方法:
java --enable-preview --source 13 Main.java{"recipe": "watermelon smoothie","duration": "10 mins","items": ["watermelon", "lemon", "parsley"]}结果字符串跨越多行 , 引号“”保留完整 , 甚至制表符 t也被保留!
数据类:Record 记录(Java 14)在本文的所有新功能中 , 这可能是我最兴奋的功能:最后 , Java中有数据类!这些类使用record关键字声明 , 并具有自动Getter , 构造函数和equals()方法等 。总之 , 您可以摆脱大量的样板代码!
jshell> record Employee (String name, int age, String department) {}|created record Employeejshell> var x = new Employee("Anne", 25, "Legal");x ==> Employee[name=Anne, age=25, department=Legal]jshell> x.name()$2 ==> "Anne"Scala对于案例类具有类似的功能 , 对于Kotlin具有数据类具有类似的功能 。到目前为止 , 在Java中 , 许多开发人员都使用Lombok , 它提供了许多功能 , 这些功能现在启发了Java 14的记录 。有关详细信息 , 请参见Baeldung这篇文章 。
不带Cast的instanceof(Java 14)Java的早期版本已经包含instanceof关键字:


推荐阅读