SpringBoot3.0最低支持JDK17,各開源軟件正在全面擁抱JDK17.
在2022年Java開發(fā)人員生產(chǎn)力報(bào)告中,有升級計(jì)劃的調(diào)查受訪者中,37%的人計(jì)劃在未來六個月內(nèi)升級到2021年9月份發(fā)布的LTS版本JDK 17。另有25%的人計(jì)劃在未來6到12個月內(nèi)升級到JDK 17。
這5個你喜歡的JDK17新功能,會讓你升級JDK17嗎?
1. record 類 (記錄類)
傳統(tǒng)的Java應(yīng)用程序通過創(chuàng)建一個類,通過該類的構(gòu)造方法實(shí)例化類,并通過getter和setter方法訪問成員變量或者設(shè)置成員變量的值。有了record關(guān)鍵字,你的代碼會變得更加簡潔。
package cn.dayangshuo;
/**
* 普通的dto
* @author DAYANG
*/
public class NormalEntity {
public static void main(String[] args) {
//傳統(tǒng)的方式
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陸續(xù)增加了更多字符串方法,操作字符串更簡單了。
- isBlank():如果字符串為空或字符串僅包含空格(包括制表符),則返回 true。注意與isEmpty() 不同,isEmpty()僅在長度為 0 時(shí)返回 true。
- lines():將字符串拆分為字符串流,每個字符串包含一行。
- strip() : 分別從開頭和結(jié)尾;
- stripLeading()/stripTrailing()僅開始和僅結(jié)束刪除空格。
- repeat(int times):返回一個字符串,該字符串采用原始字符串并按指定的次數(shù)重復(fù)該字符串。
- readString():允許從文件路徑直接讀取到字符串。
- writeString(Path path):將字符串直接寫入指定路徑處的文件。
- indent(int level):縮進(jìn)字符串的指定量。負(fù)值只會影響前導(dǎo)空格。
- transform(Function f):將給定的 lambda 應(yīng)用于字符串。
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表達(dá)式
上代碼:
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文本時(shí),需要多個繁瑣的嵌套轉(zhuǎn)義,代碼寫著費(fèi)勁,維護(hù)更費(fèi)勁。從Java13開始引入了文本塊(Text blocks),上代碼:
package cn.dayangshuo;
/**
* @author DAYANG
*/
public class TextBlocks {
public static void main(String[] args) {
//需要轉(zhuǎn)義
String jsonStr = "{\"name\": \"大陽\"}";
//文本塊,不需要轉(zhuǎn)義字符
String textBlocks = """
{"name": "大陽"}
""";
System.out.println(jsonStr);
System.out.println(textBlocks);
}
}
5. 密封類(Sealed classes)
package cn.dayangshuo;
/**
* 定義一個抽象密封類Pet,它的實(shí)現(xiàn)類只能是Dog, Cat這兩個,其他的實(shí)現(xiàn)類均不允許
* @author DAYANG
*/
public abstract sealed class Pet
permits Dog, Cat {}
final class Dog extends Pet {
}
final class Cat extends Pet {
}