Java17新特性之Switch表達(dá)式改進(jìn)的使用小結(jié)
Java 17 對(duì) ??switch?? 表達(dá)式進(jìn)行了進(jìn)一步改進(jìn),使其更加簡(jiǎn)潔、直觀,并支持更現(xiàn)代的編程風(fēng)格。這些改進(jìn)最初在 Java 12 和 Java 13 中作為預(yù)覽特性引入,最終在 Java 14 中成為正式特性。Java 17 繼續(xù)支持并增強(qiáng)了這一功能。
以下是 ??switch?? 表達(dá)式改進(jìn)的關(guān)鍵點(diǎn):
1. ??switch?? 作為表達(dá)式
傳統(tǒng)上,??switch??? 是一個(gè)語(yǔ)句(statement),而從 Java 14 開始,??switch?? 可以作為一個(gè)表達(dá)式(expression)來(lái)使用。這意味著它可以返回一個(gè)值,從而簡(jiǎn)化代碼邏輯。
示例:
// 傳統(tǒng) switch 語(yǔ)句
int dayNumber;
String day = "MONDAY";
switch (day) {
case "MONDAY":
case "TUESDAY":
case "WEDNESDAY":
dayNumber = 1;
break;
case "THURSDAY":
dayNumber = 2;
break;
default:
dayNumber = 0;
}
// 使用 switch 表達(dá)式
int dayNumber = switch (day) {
case "MONDAY", "TUESDAY", "WEDNESDAY" -> 1;
case "THURSDAY" -> 2;
default -> 0;
};
關(guān)鍵點(diǎn):
- 使用箭頭語(yǔ)法 ?
?->??? 替代傳統(tǒng)的 ??case??? 和 ??break??。 - 每個(gè)分支直接返回一個(gè)值,無(wú)需 ?
?break??。 - 多個(gè) ?
?case??? 可以用逗號(hào)分隔,例如 ??case "MONDAY", "TUESDAY", "WEDNESDAY"??。
2. 箭頭語(yǔ)法 (??->??)
箭頭語(yǔ)法是 ??switch??? 表達(dá)式的亮點(diǎn)之一,它消除了傳統(tǒng) ??switch??? 語(yǔ)句中常見的“漏掉 ??break??”問題。
示例:
String result = switch (day) {
case "MONDAY" -> "Start of the work week";
case "FRIDAY" -> "End of the work week";
case "SATURDAY", "SUNDAY" -> "Weekend!";
default -> "Midweek days";
};
System.out.println(result);
優(yōu)點(diǎn):
- 更加簡(jiǎn)潔,避免了傳統(tǒng) ?
?switch?? 的冗長(zhǎng)結(jié)構(gòu)。 - 不需要顯式地寫 ?
?break??,減少了出錯(cuò)的可能性。
3. 支持塊表達(dá)式
如果某個(gè) ??case??? 需要執(zhí)行多行代碼,可以使用大括號(hào) ??{}??? 定義一個(gè)塊表達(dá)式,并通過(guò) ??yield?? 返回值。
示例:
String result = switch (day) {
case "MONDAY" -> "Start of the work week";
case "FRIDAY" -> {
System.out.println("It's Friday!");
yield "End of the work week"; // 使用 yield 返回值
}
case "SATURDAY", "SUNDAY" -> "Weekend!";
default -> "Midweek days";
};
注意:
- 在塊表達(dá)式中,必須使用 ?
?yield?? 來(lái)返回值。 - ?
?yield??? 是專門為 ??switch?? 表達(dá)式設(shè)計(jì)的關(guān)鍵字。
4. 模式匹配(Pattern Matching)的支持
Java 17 引入了對(duì)模式匹配的初步支持,這使得 ??switch?? 表達(dá)式可以用于更復(fù)雜的類型檢查和解構(gòu)操作。
示例:
假設(shè)我們有一個(gè)類層次結(jié)構(gòu):
sealed interface Shape permits Circle, Rectangle {}
record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}
我們可以使用 ??switch?? 表達(dá)式進(jìn)行模式匹配:
double area = switch (shape) {
case Circle c -> Math.PI * c.radius() * c.radius();
case Rectangle r -> r.width() * r.height();
};
System.out.println("Area: " + area);
關(guān)鍵點(diǎn):
- 這種模式匹配結(jié)合了 ?
?instanceof??? 和 ??switch?? 的功能。 - 直接在 ?
?case??? 中解構(gòu)對(duì)象(如 ??Circle c??? 和 ??Rectangle r??)。
5. 默認(rèn)行為
在 ??switch?? 表達(dá)式中,所有可能的情況都必須被覆蓋,否則會(huì)導(dǎo)致編譯錯(cuò)誤。這是為了確保表達(dá)式總是能返回一個(gè)值。
示例:
int number = switch (value) {
case 1 -> 10;
case 2 -> 20;
// 缺少 default 會(huì)報(bào)錯(cuò)
};
正確的寫法:
int number = switch (value) {
case 1 -> 10;
case 2 -> 20;
default -> 0; // 必須有 default 或覆蓋所有情況
};
6. 總結(jié)與優(yōu)勢(shì)
??switch?? 表達(dá)式的改進(jìn)帶來(lái)了以下好處:
- 更簡(jiǎn)潔的語(yǔ)法:
- 使用箭頭語(yǔ)法 ?
?->??? 和塊表達(dá)式 ??{}??,減少冗余代碼。 - 不再需要手動(dòng)寫 ?
?break??。
- 更安全的邏輯:
- 所有可能的分支都必須被覆蓋,避免遺漏。
- 支持現(xiàn)代特性:
- 結(jié)合模式匹配,支持更復(fù)雜的類型檢查和數(shù)據(jù)解構(gòu)。
- 提高可讀性:
- 代碼更加直觀,易于理解和維護(hù)。
適用場(chǎng)景
- 簡(jiǎn)單的條件判斷:替代傳統(tǒng)的 ?
?if-else??? 或 ??switch?? 語(yǔ)句。 - 復(fù)雜的數(shù)據(jù)處理:結(jié)合模式匹配,處理不同類型的對(duì)象。
- 多分支邏輯:如狀態(tài)機(jī)、解析器等場(chǎng)景。
通過(guò)這些改進(jìn),Java 的 ??switch?? 表達(dá)式變得更加現(xiàn)代化,能夠更好地適應(yīng)現(xiàn)代開發(fā)需求,同時(shí)提高了代碼的簡(jiǎn)潔性和安全性。
到此這篇關(guān)于Java17新特性之Switch表達(dá)式改進(jìn)的使用小結(jié)的文章就介紹到這了,更多相關(guān)Java17 Switch表達(dá)式改進(jìn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用jdbcTemplate查詢返回自定義對(duì)象集合代碼示例
這篇文章主要介紹了使用jdbcTemplate查詢返回自定義對(duì)象集合代碼示例,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
AbstractQueuedSynchronizer內(nèi)部類Node使用講解
這篇文章主要為大家介紹了AbstractQueuedSynchronizer內(nèi)部類Node使用講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
使用springboot對(duì)外部靜態(tài)資源文件的處理操作
這篇文章主要介紹了使用springboot對(duì)外部靜態(tài)資源文件的處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
MyBatis-Plus模糊查詢特殊字符串轉(zhuǎn)義的實(shí)現(xiàn)
使用MyBatis中的模糊查詢時(shí),當(dāng)查詢關(guān)鍵字中包括有_、\、%時(shí),查詢關(guān)鍵字失效,本文主要介紹了MyBatis-Plus模糊查詢特殊字符串轉(zhuǎn)義的實(shí)現(xiàn),感興趣的可以了解一下2024-06-06
Java線程的生命周期命名與獲取代碼實(shí)現(xiàn)
這篇文章主要介紹了Java線程的生命周期命名與獲取代碼實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java版本怎么選以及JDK各版本特性對(duì)比與實(shí)戰(zhàn)建議
Java是一種廣泛使用的編程語(yǔ)言,擁有一個(gè)龐大的社區(qū)和大量的生態(tài)系統(tǒng),自從Java的早期版本以來(lái),它已經(jīng)經(jīng)歷了許多變化和改進(jìn),這篇文章主要介紹了Java版本怎么選以及JDK各版本特性對(duì)比與實(shí)戰(zhàn)建議的相關(guān)資料,需要的朋友可以參考下2025-11-11
IDEA中調(diào)用方法時(shí),如何同步顯示方法的注釋信息
這篇文章主要介紹了IDEA中調(diào)用方法時(shí),如何同步顯示方法的注釋信息問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03

