还在使用Java8( 这5个Java17新功能,你会喜欢的)

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 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. 文本块 【还在使用Java8( 这5个Java17新功能,你会喜欢的)】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 { }

    推荐阅读