详解 Java 17 中的模式匹配(Pattern Matching)
詳解 Java 17 中的模式匹配(Pattern Matching)
提到模式匹配(Pattern Matching),Java 開(kāi)發(fā)人員可能會(huì)比較陌生。實(shí)際上,其他編程語(yǔ)言的開(kāi)發(fā)人員早就已經(jīng)使用過(guò)模式匹配了。JVM 上的編程語(yǔ)言 Scala 的模式匹配功能就很強(qiáng)大。
什么是模式匹配?
為了更好地解釋模式匹配,我們從一個(gè)簡(jiǎn)單的例子開(kāi)始 。我們希望創(chuàng)建一個(gè)方法,可以把任何對(duì)象轉(zhuǎn)換成 String 格式 。這就需要根據(jù)對(duì)象的類(lèi)型來(lái)進(jìn)行不同的格式化操作 。我們可以很容易就寫(xiě)出下面這樣的代碼。這段代碼的核心是使用 instanceof 操作符來(lái)檢查輸入對(duì)象的類(lèi)型,再根據(jù)對(duì)象類(lèi)型進(jìn)行格式化操作。
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(); } }}上述對(duì) instanceof 操作符的使用就是模式匹配的一種簡(jiǎn)單形式 。
一個(gè)模式由匹配 predicate 和模式變量的集合組成。
- 匹配 predicate 判斷一個(gè)模式是否可以匹配目標(biāo)對(duì)象 。
- 如果模式匹配的話 ,模式變量的集合用來(lái)從目標(biāo)對(duì)象中提取值。
在 instanceof 操作符的例子中,匹配 predicate 的作用是檢查目標(biāo)對(duì)象的類(lèi)型,而模式變量的集合中只有一個(gè)變量,就是目標(biāo)對(duì)象自身 。這種類(lèi)型的模式,被稱(chēng)為類(lèi)型模式(type pattern)。除了類(lèi)型模式之外,計(jì)劃中的模式還包括記錄類(lèi)型模式和數(shù)組模式