Java14不得不知的5個(gè)新功能
雖然我們現(xiàn)在還用的JDK8
文本塊
以前在Java里寫個(gè)長(zhǎng)點(diǎn)的字符串是這個(gè)樣子地:
String sql = "select * from t_tianlangstudio_student"?
+ " where age > 23 and age < 30"?
+? " and? sex = 1";
如果字符串中再包含有雙引號(hào)還需要轉(zhuǎn)義,雖然有IDE幫忙,但還是時(shí)常羨慕Scala、Rust里的文本塊(多行字符串)的寫法,那個(gè)酸爽,Java14里終于也可以這樣寫了:
public static String? index = """
<html>
<head>
? ? ? <title>tianlangstudio</title>
</head>
<body>
? ? ? <h1>一個(gè)不安分的程序員</h1>
</body>
</html>
""";
是不是清爽多了?
Switch表達(dá)式
以前使用switch大概是這個(gè)樣子地 :
public static int? codeDemo(int i)? {
int result;
switch(i) {
case 1:
case 2:
? ? ? ? result = 18;
? ? ? ? break;
case 3:
? ? ? ? result = 28;
? ? ? ? break;
default:
? ? ? ? ? result = 100;
? ? ? ? ? break;
? ? ? ? ? ? }
return result;
}
現(xiàn)在可以這樣寫了:
public static int code(String s)? {
int result = switch(s) {
? ? ? ? ? ? ? ? ? case "a"? , "b"? -> 1;
? ? ? ? ? ? ? ? ? case "c"? -> 2;
? ? ? ? ? ? ? ? ? default -> 100;
? ? ? ? }
? ? ? ? return result;
}
是不是清爽了很多?Java也開始區(qū)分表達(dá)式和(聲明)語(yǔ)句了?關(guān)于表達(dá)式和語(yǔ)句可以參考Rust.
不過Rust里更多使用Match,Java14也對(duì)模式匹配有了些許支持,主要體現(xiàn)在instanceOf的使用上。
instanceOf
使用instanceOf判斷一個(gè)變量是否屬于某個(gè)類型的實(shí)例的同時(shí),還能聲明一個(gè)變量作為當(dāng)前類型的實(shí)例進(jìn)行更多的判斷.就像這個(gè)樣子:
? ? ? public static void demo(Object obj) {
? ? ? ? ? ? ? if (obj instanceof String s && s.length() > 4) {
? ? ? ? ? ? ? System.out.println("it is a String and length greater than 4");
? ? ? ? ? ? ? ? }
? ? ? }
沒看出哪里不一樣了?注意看String s ??梢宰孕心X補(bǔ)下要使用JDK8編寫代碼是什么樣子的?
record
有沒覺得每次定義個(gè)(Java類)POJO,需要寫大量的get,set方法還得重寫equals方法特別麻煩,是不是也想要Scala中的樣例類、Rust中的類元組struct那樣簡(jiǎn)潔的類型定義方式?
Java14提供了record,可以這樣定義類型了:
public static void main(String[] args) {
Person person1 = new Person("Tianlang", 23);
Person person2 = new Person("Tianlang",? 23);
System.out.println(person1.equals(person2));? // true
}
public static record Person(String name, int age){}
就問你清爽不清爽 ?
更有用的空指針異常提示信息
你是否也像我一樣經(jīng)常寫鏈?zhǔn)秸{(diào)用的代碼,就像這樣:
String str = obj.fieldA.fieldAA.fieldAAA;
這樣寫起來可以少費(fèi)幾根頭發(fā)起變量名稱,直到出現(xiàn)了空指針異常,異常信息只告訴你那一行出現(xiàn)了空指針,為了調(diào)試代碼只好類似這樣:
System.out.println(obj);
System.out.println(obj.fieldA);
System.out.println(obj.fieldA.fieldAA);
String str = obj.fieldA.fieldAA.fieldAAA;
是否也曾像我一樣從心底升起無數(shù)個(gè)草泥馬. 可能是我們的呼喚起了作用,終于在Java14中會(huì)告訴你具體那個(gè)代碼調(diào)用出了空指針。記得要在代碼執(zhí)行時(shí)設(shè)置:
-XX:+ShowCodeDetailsInExceptionMessages