前言
2021年9月14日Java 17发布,作为新时代的农民工,有必要了解一下都有哪些新东西。
Java 17是Java 11以来又一个LTS(长期支持)版本,Java 11 和Java 17之间发生了那些变化可以在OpenJDK官网找到JEP(Java增强建议)的完整列表。
本期文章会重点介绍在语法方面Java 17的更新,并且通过一些代码示例让大家更容易理解,主要涉及以下9个点:
- 文本块
- switch表达式
- record关键字
- sealed classes密封类
- instanceof模式匹配
- Helpful NullPointerExceptions
- 日期周期格式化
- 精简数字格式化支持
- Stream.toList()简化
文本块
在Java17之前的版本里,如果我们需要定义一个字符串,比如一个JSON数据,基本都是如下方式定义:
public void lowVersion() {
String text = "{\n" +
" \"name\": \"小黑说Java\",\n" +
" \"age\": 18,\n" +
" \"address\": \"北京市西城区\"\n" +
"}";
System.out.println(text);
}
这种方式定义具有几个问题:
- 双引号需要进行转义;
- 为了字符串的可读性需要通过+号连接;
- 如果需要将JSON复制到代码中需要做大量的格式调整(当然这一点也可以通过其他工具解决);
通过Java 17中的文本块语法,类似的字符串处理则会方便很多;通过三个双引号可以定义一个文本块,并且结束的三个双引号不能和开始的在同一行。
上面例子中的JSON可以更方便,可读性更好的通过文本块定义。代码如下:
private void highVersion() {
String text = """
{
"name": "小黑说Java",
"age": 18,
"address": "北京市西城区"
}
""";
System.out.println(text);
}
这段代码的输出结果是:
{
"name": "小黑说Java",
"age": 18,
"address": "北京市西城区"
}
switch表达式
Java 17版本中switch表达式将允许switch有返回值,并且可以直接作为结果赋值给一个变量,等等一系列的变化。
下面有一个switch例子,依赖于给定的枚举值,执行case操作,故意省略break。
private static void lowVesion(Fruit fruit) {
switch (fruit) {
case APPLE, PEAR:
System.out.println("普通水果");
case MANGO, AVOCADO:
System.out.println("进口水果");
default:
System.out.println("未知水果");
}
}
我们调用这个方法传入一个APPLE,会输出以下结果:
普通水果
进口水果
未知水果
显然这不是期望的结果,因为我们需要在每个case里添加break防止所有的case都没执行。
private static void lowVesion(Fruit fruit) {
switch (fruit) {
case APPLE, PEAR:
System.out.println("普通水果");