還記得Java 16中的instanceof增強 嗎? 通過下麵這個例子再回憶一下: Map<String, Object> data = new HashMap<>(); data.put("key1", "aaa"); data.put("key2", 111); if (data.get("k ...
還記得Java 16中的instanceof增強 嗎?
通過下麵這個例子再回憶一下:
Map<String, Object> data = new HashMap<>();
data.put("key1", "aaa");
data.put("key2", 111);
if (data.get("key1") instanceof String s) {
log.info(s);
}
上面這個場景里,Map中的Value值存在不同的類型,所以使用instanceof
來判斷取出的value是什麼類型,然後根據不同類型來進行處理。那麼,接下來繼續思考一個問題,如果這個Map中的Value可能有這幾種類型:String、Integer、Double,我們需要對不同類型分別做不同的處理,是不是處理結構要這樣寫:
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);
}
面對這樣的if
語句結構,看著是不是很難受?根據以往的經驗,是不是這個時候想到用switch
來改進一下呢?但是再琢磨下,發現這裡判斷的時候又用到了instanceof
,似乎一下又不好下手了?
於是,在面對這種場景的時候,Java 17對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("");
}
有沒有一下變得很簡潔呢?
這裡的幾個重點值得關註:
case
條件中直接涵蓋了類型的判斷和類型的轉換,這個功能類似與Java 16中對instanceof的增強- 每個
case
的處理邏輯用Lambda
語法來實現,可以免去break
語句(這是JDK 12中引入的特性)
另外,要註意的是,對於switch表達式中模式匹配的功能,JDK 17中的實現還是preview版本,所以瞭解為主,目前還不推薦用於正式環境,不排除後續有進一步改進的可能。
好了,今天的分享就到這裡!如果您學習過程中如遇困難?可以加入我們超高質量的技術交流群,參與交流與討論,更好的學習與進步!另外,不要走開,關註我!持續更新Java新特性專欄!
歡迎關註我的公眾號:程式猿DD。第一時間瞭解前沿行業消息、分享深度技術乾貨、獲取優質學習資源