详解 Java 17 中的模式匹配(Pattern Matching)
詳解 Java 17 中的模式匹配(Pattern Matching)
提到模式匹配(Pattern Matching) ,Java 開發(fā)人員可能會比較陌生。實際上,其他編程語言的開發(fā)人員早就已經(jīng)使用過模式匹配了。JVM 上的編程語言 Scala 的模式匹配功能就很強大。
什么是模式匹配 ?
為了更好地解釋模式匹配 ,我們從一個簡單的例子開始 。我們希望創(chuàng)建一個方法 ,可以把任何對象轉(zhuǎn)換成 String 格式 。這就需要根據(jù)對象的類型來進行不同的格式化操作。我們可以很容易就寫出下面這樣的代碼 。這段代碼的核心是使用 instanceof 操作符來檢查輸入對象的類型 ,再根據(jù)對象類型進行格式化操作 。
public class ObjectFormatter { public String format(Object input) { if (input == null) { return ""; } else if (input instanceof Number) { return NumberFormat.getNumberInstance().format(input); } else if (input instanceof LocalDateTime) { return ((LocalDateTime) input).format(DateTimeFormatter.ISO_DATE_TIME); } else { return input.toString(); } }}上述對 instanceof 操作符的使用就是模式匹配的一種簡單形式 。
一個模式由匹配 predicate 和模式變量的集合組成。
- 匹配 predicate 判斷一個模式是否可以匹配目標(biāo)對象。
- 如果模式匹配的話,模式變量的集合用來從目標(biāo)對象中提取值。
在 instanceof 操作符的例子中 ,匹配 predicate 的作用是檢查目標(biāo)對象的類型,而模式變量的集合中只有一個變量,就是目標(biāo)對象自身。這種類型的模式,被稱為類型模式(type pattern)。除了類型模式之外 ,計劃中的模式還包括記錄類型模式和數(shù)組模式。
模式匹配是一個涵蓋范圍非常大的功能。根據(jù)現(xiàn)在 Java 的發(fā)布周期,模式匹配的內(nèi)容會在不同的 Java 版本中逐漸添加進來。具體的發(fā)布周期可以參考下面的表格。這個表格的右側(cè)三列表示的是不同的與模式匹配相關(guān)的功能,每一行表示這些功能在對應(yīng) Java 版本中的可用狀態(tài)。
Java版本 | instanceof 模式 | switch 的模式匹配 | 記錄類型模式 |
Java 14 | 預(yù)覽 | ||
Java 15 | 二次預(yù)覽 | ||
Java 16 | 正式功能 | ||
Java 17 | 正式功能 | 預(yù)覽 | |
Java 18 | 正式功能 | 二次預(yù)覽 | |
Java 19 | 正式功能 | 三次預(yù)覽 | 預(yù)覽 |
以 Java 17 為例 ,可以使用 instance 模式的正式功能,以及 switch 模式匹配的預(yù)覽功能 。
Java 18 和 Java 19 中可用的模式匹配功能也列在了表格中,作為參考 。
instanceof 模式匹配
Java 中的 instanceof 操作符用來檢查對象的類型。下面的代碼給出了通常使用 instanceof 操作符的代碼范式。在 if 語句中使用 instanceof 來進行檢查,如果檢查通過 ,則使用強制類型轉(zhuǎn)換,把輸入對象 obj 轉(zhuǎn)換成 String 類型的 s ,最后再使用變量 s。
if (obj instanceof String) { String s = (String) obj;}從上述代碼中可以看到