年底即将发布的SpringBoot3.0最低支持Java17版本
这里记录下新语法和值得注意的库
语法特性
module
JDK9
模块系统
Java 9 模块的重要特征是在其工件的根目录中包含了一个描述模块的 module-info.java 文 件通过exports向外开放接口/类, 限定模块使用范围同时通过requires定义该模块所需依赖
module com.mycompany.sample { exports com.mycompany.sample; requires com.mycompany.common; provides com.mycompany.common.DemoService with com.mycompany.sample.DemoServiceImpl; }
复制
Try-with-resources 允许有效地使用最终变量
JDK9
java9之前
FileInputStream fis = new FileInputStream("test"); //编译失败 try (fis) { } //只允许这样 try (FileInputStream fis = new FileInputStream("test")) { }
复制
java9之后
FileInputStream fis = new FileInputStream("test"); try (fis) { }
复制
接口的私有方法
JDK9
interface ITest { //必须有方法体 private void test () { } }
复制
匿名内部类泛型
JDK9
interface Foo<T> { void test(T t); } //java9之前编译失败 Foo<String> f = new Foo<>() { // test()方法的参数类型为String public void test(String t) { System.out.println("test 方法的 t 参数为:" + t); } };
复制
类型推断
JDK10
JDK11增强
使用var进行类型推断的变量必须进行初始化JDK10
var str = "sss"; var map = new HashMap<String, String>(); for (var s : list) { }
复制
JDK11
加入了对lambda参数的支持
//JDK10 IntFunction<Integer> integerIntFunction = (int t) -> t / 2; //JDK11 IntFunction<Integer> integerIntFunction2 = (var t) -> t / 2;
复制
Switch 表达式扩展
JDK14
JDK12/13预览
int numLetters = switch (day) { //分支可以并列 使用 箭头可以直接返回一个值 case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; default -> { String s = day.toString(); int result = s.length(); //使用 yield 关键字返回一个值, 并退出switch代码块 yield result; } };
复制
更友好的空指针异常信息
JDK15
JDK14预览
a.b.c.i = 99;
复制
console
Exception in thread "main" java.lang.NullPointerException:
Cannot read field "c" because "a.b" is null
复制
文本块
JDK15
JDK13/14预览
\
:行终止符,主要用于阻止插入换行符
\s
:表示一个空格。可以用来避免末尾的白字符被去掉。
String html = """ <html> \ <body> \s <p>Hello, world</p> </body> </html> """;
复制
instanceof 模式匹配
JDK16
JDK14/15预览
//jdk 14之前 if (object instanceof Kid) { Kid kid = (Kid) object; // ... } else if (object instanceof Kiddle) { Kid kid = (Kid) object; // ... }
复制
//jdk 14+ if (object instanceof Kid kid) { // ... } else if (object instanceof Kiddle kiddle) { // ... } //注意,如果 if 条件中有 && 运算符时,当 instanceof 类型匹配成功,模式局部变量的作用范围也可以相应延长 //并不适用于或 || 运算符. 如下面代码: if (obj instanceof String s && s.length() > 5) { System.out.println("obj is a String with more than 5 characters: " + s.toUpperCase()); }
复制
Record 类型
功能类似lombok的@Data吧
但是record类型内的字段为final类型, 只能在构造方法内初始化, 且只提供对应字段的get方法, 场景有限
JDK16
JDK14/15预览
record Point(int x, int y) { } var point = new Point(1, 2); point.x(); // returns 1 point.y(); // returns 2
复制
密封类
可以限制哪些其他类可以继承或实现它们
JDK17
JDK15/16预览
// 添加sealed修饰符,permits后面跟上只能被继承的子类名称 public sealed class Person permits Teacher, Worker, Student{ } //人 // 子类可以被修饰为 final final class Teacher extends Person { }//教师 // 子类可以被修饰为 non-sealed,此时 Worker类就成了普通类,谁都可以继承它 non-sealed class Worker extends Person { } //工人 // 任何类都可以继承Worker class AnyClass extends Worker{} //子类可以被修饰为 sealed,同上 sealed class Student extends Person permits MiddleSchoolStudent,GraduateStudent{ } //学生 final class MiddleSchoolStudent extends Student { } //中学生 final class GraduateStudent extends Student { } //研究生
复制
Switch 模式匹配
JDK17预览
String formatterPatternSwitch(Object o) { return switch (o) { //甚至能判断null case null -> "null"; // 如果对象是Integer类型 就转换为 Integer类型 和 instanceof 模式匹配很像, 相当于和Switch进行整合了 case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.getClass().getSimpleName() + " " + o; }; }
复制
API特性
仅列出值得关注的一些特性
JDK9
- 集合上,Java 9 增加 了 List.of()、Set.of()、Map.of() 和 Map.ofEntries()等工厂方法来创建不可变集合. Stream 中增加了新的方法 ofNullable、dropWhile、takeWhile 和 iterate . Collectors 中增加了新的方法 filtering 和 flatMapping
- Java 9 增加了 ProcessHandle 接口,可以对原生进程进行管理
- 变量句柄, 增强方法句柄
- I/O 流新特性 readAllBytes/readNBytes/transferTo
- Arrays.mismatch 找到两个数组之间的第一个不匹配元素
JDK11
- 飞行记录器
- 使用默认类数据共享(CDS)存档 减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用
- 字符串增强,如isBlank/lines/repeatstrip
- HttpClient
JDK12
- 字符串增强,indent和transform
- Files.mismatch 找到两个数组之间的第一个不匹配的字节
- Collectors.teeing
JDK13
- Socket API 重构
JDK14
- @Serial : 与@Override类似,此注解与-Xlint结合使用,以对类的与序列化相关的成员执行编译时检查。
JDK15
- 隐藏类
JDK16
- Stream.toList
REF
https://advancedweb.hu/a-categorized-list-of-all-java-and-jvm-features-since-jdk-8-to-18