Java7到Java17, Switch語句進化史
theme: cyanosis
前言
自 Java 7 以來,java 中的 switch
語句經歷了快速發展。因此,在本文中,我們將通過示例討論 switch
語句從 java 7 到 java 17 的演變或變化。
歡迎關注個人公眾號【JAVA旭陽】交流學習
Java 7
在 Java 7 之前,switch case
中只能使用整數,這個語法持續了很長的一段時間。
int value = 5;
switch (value) {
case 1:
System.out.println("One");
break;
case 5:
System.out.println("five");
break;
default:
System.out.println("Unknown");
}
Java 8
在 Java 8 中,switch
語句中的case
部分支持字符串和枚舉。
字符串case
例子
String day = "Tuesday";
switch (day) {
case "Monday":
System.out.println("Week day");
break;
case "Tuesday":
System.out.println("Week day");
break;
case "Wednesday":
System.out.println("Week day");
break;
case "Thursday":
System.out.println("Week day");
break;
case "Friday":
System.out.println("Week day");
break;
case "Saturday":
System.out.println("Weekend");
break;
case "Sunday":
System.out.println("Weekend");
break;
default:
System.out.println("Unknown");
}
枚舉case
例子
enum DAYS {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
DAYS days = DAYS.SUNDAY;
switch (days) {
case MONDAY:
System.out.println("Weekdays");
break;
case TUESDAY:
System.out.println("Weekdays");
break;
case WEDNESDAY:
System.out.println("Weekdays");
break;
case THURSDAY:
System.out.println("Weekdays");
break;
case FRIDAY:
System.out.println("Weekdays");
break;
case SATURDAY:
System.out.println("Weekends");
break;
case SUNDAY:
System.out.println("Weekends");
break;
default:
System.out.println("Unknown");
}
Java 12
Java 12 中進一步增強了 switch 語句,並引入了 switch 表達式作為預覽功能。
- 您可以從
switch
塊中返回值,因此switch
語句成為switch
表達式 - 您可以在一個
case
中有多個值 - 您可以通過箭頭運算符從
switch
表達式返回值 - 通過
break
關鍵字返回值
通過 break 關鍵字返回值例子
return switch (day) {
case "Monday":
break "Weekday";
case "Tuesday":
break "Weekday";
case "Wednesday":
break "Weekday";
case "Thursday":
break "Weekday";
case "Friday":
break "Weekday";
case "Saturday":
break "Weekend";
case "Sunday":
break "Weekend";
default:
break "Unknown";
};
通過箭頭運算符返回值
return switch (day) {
case "Monday"-> "Week day";
case "Tuesday"-> "Week day";
case "Wednesday"->"Week day";
case "Thursday"->"Week day";
case "Friday"->"Week day";
case "Saturday"-> "Weekend";
case "Sunday"-> "Weekend";
default->"Unknown";
};
case
中多個值的例子
同樣 Java 12 可以在單個 case
語句中提供多個 case
值,如下所示
return switch (day) {
case "Monday","Tuesday","Wednesday","Thursday","Friday"
-> "Week day";
case "Saturday", "Sunday" -> "Weekend";
default->"Unknown";
};
Java 13
上面通過break
關鍵字返回值,在 Java 13 中被“yield
”關鍵字取代。
return switch (day) {
case "Monday":
yield "Weekday";
case "Tuesday":
yield "Weekday";
case "Wednesday":
yield "Weekday";
case "Thursday":
yield "Weekday";
case "Friday":
yield "Weekday";
case "Saturday":
yield "Weekend";
case "Sunday":
yield "Weekend";
default:
yield "Unknown";
};
Java 14
到目前為止,我們在 Java 12 和 13 中討論的 switch
語句和功能都是預覽功能,通過標記參數 –enable-preview=true
開啟功能 。
但是 Java 14 只是將所有功能從預覽功能變成了標準功能,無需設置標誌 –enable-preview=true
也能使用上面所説的方式。
Java 17
Java 17 LTS 是 Java SE 平台的最新長期支持版本,發佈於2021年9月15日,又增強了switch
的功能。
- 模式匹配
您可以在 switch 條件下傳遞對象,並且可以在 switch case
標籤中檢查該對象的不同類型,如下面的例子:
return switch (obj) {
case Integer i -> "It is an integer";
case String s -> "It is a string";
case Employee s -> "It is a Employee";
default -> "It is none of the known data types";
};
在上面的示例中,我將一個對象傳遞給切換條件,這在 Java 17 之前是不可能的。然後可以檢查該對象的特定數據類型並將其分配給變量。
例如case Integer i- > "It is an integer";
表示檢查傳遞的對象是否為“Integer”類型,如果它是整數,則將其分配給變量“i”。並通過箭頭運算符返回字符串“It is an integer
”。
- 保護模式
讓我們來看看這個用例。
在我檢查了“Employee
”實例的案例標籤內,我想進行額外的檢查。
通常你會像下面這麼做:
case Employee emp:
if(emp.getDept().equals("IT")) {
yield "This is IT Employee";
}
但是 Java 17 引入了“保護模式”, 你可以修改成下面的方式:
return switch (obj) {
case Integer i -> "It is an integer";
case String s -> "It is a string";
case Employee employee && employee.getDept().equals("IT") -> "IT Employee";
default -> "It is none of the known data types";
};
- 空值處理
在 Java 17 之前,您永遠無法將 null 值傳遞給 switch 語句,而不會拋出 Null 指針異常,Java 17 允許你這樣處理,比如下面的方式:
case null -> "It is a null object";
如果你有上面的 switch 表達式,如果你傳遞的對象是空的,你將永遠不會得到空指針異常。
總結
上面就是從 Java 7 到 Java 17 switch case
的進化史,雖然沒大用,大家就瞭解瞭解吧。
歡迎關注個人公眾號【JAVA旭陽】交流學習
- Java7到Java17, Switch語句進化史
- 樂觀鎖思想在JAVA中的實現——CAS
- 一步步帶你設計MySQL索引數據結構
- 我總結了寫出高質量代碼的12條建議
- 工作這麼多年,我總結的數據傳輸對象 (DTO) 的最佳實踐
- Spring項目中用了這種解耦模式,經理對我刮目相看
- 大數據HDFS憑啥能存下百億數據?
- 5個接口性能提升的通用技巧
- 你的哪些SQL慢?看看MySQL慢查詢日誌吧
- 90%的Java開發人員都會犯的5個錯誤
- 喪心病狂,竟有Thread.sleep(0)這種寫法?
- 為什麼更推薦使用組合而非繼承關係?
- 一個30歲程序員的覺醒和進擊
- 推薦8個提高工作效率的IntelliJ插件
- 公司的這種打包啟動方式,我簡直驚呆了
- 告別醜陋判空,一個Optional類搞定
- 你不知道的Map家族中的那些冷門容器
- SpringBoot 2.x整合Log4j2日誌
- SpringBoot應用自定義logback日誌
- 你確定懂了Java中的序列化機制嗎