SpringBoot3.0最低反对JDK17,各开源软件正在全面拥抱JDK17.
在2022年Java开发人员生产力报告中,有降级打算的考察受访者中,37%的人打算在将来六个月内降级到2021年9月份公布的LTS版本JDK 17。另有25%的人打算在将来6到12个月内降级到JDK 17。
这5个你喜爱的JDK17新性能,会让你降级JDK17吗?
1. record 类 (记录类)
传统的Java应用程序通过创立一个类,通过该类的构造方法实例化类,并通过getter和setter办法拜访成员变量或者设置成员变量的值。有了record关键字,你的代码会变得更加简洁。
package cn.dayangshuo;/** * 一般的dto * @author DAYANG */public class NormalEntity { public static void main(String[] args) { //传统的形式 User1 user1 = new User1("大阳", 1990); System.out.println(user1); //reocrd 记录类 User2 user2 = new User2("大阳", 1990); System.out.println(user2); }}/** * 成员变量都是固定的 */class User1 { String name; Integer age; public User1(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User1[" + "name='" + name + '\'' + ", age=" + age + ']'; }}package cn.dayangshuo;/** * record 记录类 * 你也能够覆写equals() hashCode() toString()办法 * @author DAYANG */record User2(String name, Integer age) { @Override public String toString() { return "User2[" + "name='" + name + '\'' + ", age=" + age + ']'; } @Override public boolean equals(Object obj) { return false; } @Override public int hashCode() { return 0; }}
2. 新的字符串办法
从JDK8到JDK17陆续减少了更多字符串办法,操作字符串更简略了。
- isBlank():如果字符串为空或字符串仅蕴含空格(包含制表符),则返回 true。留神与isEmpty() 不同,isEmpty()仅在长度为 0 时返回 true。
- lines():将字符串拆分为字符串流,每个字符串蕴含一行。
- strip() : 别离从结尾和结尾;
- stripLeading()/stripTrailing()仅开始和仅完结删除空格。
- repeat(int times):返回一个字符串,该字符串采纳原始字符串并按指定的次数反复该字符串。
- readString():容许从文件门路间接读取到字符串。
- writeString(Path path):将字符串间接写入指定门路处的文件。
- indent(int level):缩进字符串的指定量。负值只会影响前导空格。
- transform(Function f):将给定的 lambda 利用于字符串。
package cn.dayangshuo;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.util.stream.Stream;/** * @author DAYANG */public class NewStringMethod { public static void main(String[] args) throws IOException { //lines()办法示例 String str = "hello \njava17 \n\r!\r"; Stream<String> lines = str.lines(); lines.forEach(System.out::println); //readString()办法示例 Path path = Path.of("C:\\NewStringMethod.java"); String text = Files.readString(path); System.out.println(text); }}
3. 清新的switch表达式
上代码:
package cn.dayangshuo;/** * @author DAYANG */public class OldSwitch { public static void main(String[] args) { oldSwitch(); newSwitch(); } private static void oldSwitch() { int size = 3; String cn = ""; switch (size) { case 1: cn = "壹"; break; case 2: cn = "贰"; break; case 3: cn = "叁"; break; default: cn = "未知"; } System.out.println(cn); } //更清新 private static void newSwitch() { int size = 3; String cn = switch (size) { case 1 -> "壹"; case 2 -> "贰"; case 3 -> "叁"; default -> "未知"; }; System.out.println(cn); }}
4. 文本块
Java解决json或者xml文本时,须要多个繁琐的嵌套本义,代码写着吃力,保护更吃力。从Java13开始引入了文本块(Text blocks),上代码:
package cn.dayangshuo;/** * @author DAYANG */public class TextBlocks { public static void main(String[] args) { //须要本义 String jsonStr = "{\"name\": \"大阳\"}"; //文本块,不须要转义字符 String textBlocks = """ {"name": "大阳"} """; System.out.println(jsonStr); System.out.println(textBlocks); }}
5. 密封类(Sealed classes)
package cn.dayangshuo;/** * 定义一个形象密封类Pet,它的实现类只能是Dog, Cat这两个,其余的实现类均不容许 * @author DAYANG */public abstract sealed class Pet permits Dog, Cat {}final class Dog extends Pet {}final class Cat extends Pet {}