Java14不得不知的5個新功能
雖然我們現(xiàn)在還用的JDK8
文本塊
以前在Java里寫個長點的字符串是這個樣子地:
String sql = "select * from t_tianlangstudio_student"?
+ " where age > 23 and age < 30"?
+? " and? sex = 1";
如果字符串中再包含有雙引號還需要轉(zhuǎn)義,雖然有IDE幫忙颅眶,但還是時常羨慕Scala、Rust里的文本塊(多行字符串)的寫法田弥,那個酸爽涛酗,Java14里終于也可以這樣寫了:
public static String? index = """
<html>
<head>
? ? ? <title>tianlangstudio</title>
</head>
<body>
? ? ? <h1>一個不安分的程序員</h1>
</body>
</html>
""";
是不是清爽多了?
Switch表達式
以前使用switch大概是這個樣子地 :
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ū)分表達式和(聲明)語句了?關(guān)于表達式和語句可以參考Rust.
不過Rust里更多使用Match偷厦,Java14也對模式匹配有了些許支持煤杀,主要體現(xiàn)在instanceOf的使用上。
instanceOf
使用instanceOf判斷一個變量是否屬于某個類型的實例的同時沪哺,還能聲明一個變量作為當(dāng)前類型的實例進行更多的判斷.就像這個樣子:
? ? ? 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 ∽萌澹可以自行腦補下要使用JDK8編寫代碼是什么樣子的?
record
有沒覺得每次定義個(Java類)POJO辜妓,需要寫大量的get,set方法還得重寫equals方法特別麻煩,是不是也想要Scala中的樣例類忌怎、Rust中的類元組struct那樣簡潔的類型定義方式?
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ā)起變量名稱榴啸,直到出現(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ù)個草泥馬. 可能是我們的呼喚起了作用鸥印,終于在Java14中會告訴你具體那個代碼調(diào)用出了空指針勋功。記得要在代碼執(zhí)行時設(shè)置:
-XX:+ShowCodeDetailsInExceptionMessages