在之前的Java 17新特性中,我們介紹過關於JEP 406: switch的模式匹配,但當時還只是關於此內容的首個預覽版本。之後在JDK 18、JDK 19、JDK 20中又都進行了更新和完善。如今,在JDK 21中,該特性得到了最終確定!下麵,我們就再正式學習一下該功能! 在以往的switch語 ...
在之前的Java 17新特性中,我們介紹過關於JEP 406: switch的模式匹配,但當時還只是關於此內容的首個預覽版本。之後在JDK 18、JDK 19、JDK 20中又都進行了更新和完善。如今,在JDK 21中,該特性得到了最終確定!下麵,我們就再正式學習一下該功能!
在以往的switch語句中,對於case
中的類型匹配限制是很多的。比如下麵這個例子中的Map
中可能存儲了不同類型的對象,我們要判斷的時候,就只能依靠if-else
來完成。
Map<String, Object> data = new HashMap<>();
data.put("key1", "aaa");
data.put("key2", 111);
if (data.get("key1") instanceof String s) {
log.info(s);
}
if (data.get("key") instanceof String s) {
log.info(s);
} else if (data.get("key") instanceof Double s) {
log.info(s);
} else if (data.get("key") instanceof Integer s) {
log.info(s);
}
現在開始,這樣的類型判斷關係,就可以簡化為如下的switch
代碼:
switch (data.get("key1")) {
case String s -> log.info(s);
case Double d -> log.info(d.toString());
case Integer i -> log.info(i.toString());
default -> log.info("");
}
這個功能還是非常有用的,尤其是存在一些抽象封裝的時候,可能存在一些父子、兄弟等關係類的時候,為了判斷是什麼類型,就不用寫很多if來處理了,代碼簡潔度可以得到進一步的優化。
對於上面的例子,還沒有升級到Java 17的用戶,還涉及兩個中間知識點,建議可以補充學習一下:第一個是Java 16中的instance of增強;第二個是switch中使用Lambda的增強。
如果您學習過程中如遇困難?可以加入我們超高質量的技術交流群,參與交流與討論,更好的學習與進步!
歡迎關註我的公眾號:程式猿DD。第一時間瞭解前沿行業消息、分享深度技術乾貨、獲取優質學習資源