首頁> Java> java教程> 主體

探索 Java 記錄模式和模式匹配

WBOY
發布: 2024-08-17 19:04:31
原創
683 人瀏覽過

Exploring Java Record Patterns and Pattern Matching

Java 記錄模式作為 Project Amber 的一部分在 Java 16 中引入,並在 Java 21 中透過添加解構函數和模式匹配進行了增強。此功能允許在 Java 應用程式中以更簡潔、更靈活的方式處理資料。在本教程中,我們將介紹記錄模式的概念、它們如何幫助模式匹配以及各種編碼範例。

1. Java 記錄快速回顧
在深入研究記錄模式之前,讓我們先快速回顧一下 Java 記錄。記錄是在 Java 14 中引入的,它是一種專門為保存不可變資料而設計的新型類別。它們透過提供更簡潔的語法來定義帶有資料的類,從而消除了編寫樣板程式碼的需要。在下面的範例中,我們定義了一條名為「Person」的記錄,其中包含三個欄位:名字、姓氏和年齡。

記錄人(字串名字,字串姓氏,整數年齡){}

記錄是不可變的,限制某些特徵:

  • 所有欄位都是最終的
  • 該類隱式是最終的
  • 禁止聲明實例欄位

Records 會自動為每個欄位產生建構函式和 getter 方法,使其比傳統類別更適合資料載體。

2.什麼是記錄模式?
Java 21 中引入的記錄模式將模式的概念與記錄結合,允許輕鬆地從記錄中解構和提取值。記錄模式由記錄類別類型和可選模式變數組成,僅當測試成功時,這些變數才會被指派從目標記錄中提取的值。

空值不符合任何記錄模式,因此在這種情況下模式變數不會被初始化。

3.記錄析構函數
析構函數是建構函數的逆函數。它從物件中提取值而不是添加它們。在記錄的上下文中,析構函數稱為「解構函數」。它允許將記錄值分解為其各個組成部分。假設我們有一條名為「Name」的記錄,其中包含以下欄位:

記錄客戶(字串名字,字串姓氏,整數年齡){}

我們可以使用解構函數從「Customer」記錄的實例中提取這些欄位的值,如下例所示:

客戶客戶 = 新客戶("Jane", "Smith", 30);

if(客戶實例 of Customer(字串名字,字串姓氏,int 年齡)){
System.out.println("名字:" + firstName); // 簡
System.out.println("姓氏:" + lastName); // 史密斯
System.out.println("年齡:" + 年齡); // 30
}

記錄結構在我們需要將多個相關值作為單一物件儲存和檢索的情況下非常有用。記錄的解構功能使我們能夠輕鬆提取並在程式碼中使用這些值。

4.在 Switch 語句中記錄模式
Java 16 引入了instanceof 語句的模式匹配,並在Java 21 中進一步擴展以包含switch 語句。它在處理多種模式時允許更簡潔和可讀的程式碼。

假設我們有一條名為「Account」的記錄,有三個子類型:「SavingAccount」、「CreditCardAccount」和「HomeLoanAccount」。每個子類型都有不同的計算餘額的方法。我們可以在 switch 語句中使用記錄模式來處理這三種情況,如下所示:

介面帳戶{}
記錄 SavingAccount(雙餘額)實現帳戶 {}
record CreditCardAccount(double CreditLimit, doubleused) 實作 Account {}
記錄 HomeLoanAccount(double totalAmount, double amountPaid) 實作帳號 {}

帳戶 account= new CreditCardAccount(10000, 1000);

切換(形狀){
案例 SavingAccount :
System.out.println("帳戶餘額為 " + 餘額);
休息;
案信用卡帳號 c:
System.out.println("信用餘額為:" + (creditLimit-used));
休息;
案例 HomeLoanAccount h:
System.out.println("餘額 " +(totalAmount-amountPaid));
休息;
預設:
System.out.println("未知帳號");
}

5.巢狀模式
除了從單一記錄中提取值之外,還可以嵌套記錄模式以處理更複雜的記錄。假設我們有一條名為「Account」的記錄,其中有一個類型為「Customer」的欄位和另一個類型為「Address」的欄位。我們可以使用巢狀記錄模式從這兩個欄位中提取值,如下例所示:

記錄客戶(字串名字,字串姓氏,整數年齡){}

記錄帳戶(客戶客戶,地址地址){}

客戶 customer = 新客戶("John", "Doe", 25);
地址 地址 = new Address("123 Main St.","城市", "州");
帳戶account = 新帳戶(客戶, 地址);

if(帳戶實例(帳戶(客戶(fName,lName,年齡),地址(街道,城市,州))){
System.out.println("名字:" + fName); // 約翰
System.out.println("姓氏:" + lName); // 母鹿
System.out.println("年齡:" + 年齡); // 25
System.out.println("地址:" + 街道 + ", " + 城市 + ", " + 州); // 123 Main St.,城市,州
}

在此範例中,我們使用兩個巢狀模式從「Account」記錄的「Customer」和「Address」欄位中提取值。

6。組件匹配
記錄模式提供了更大的彈性,因為模式變數不必與記錄的元件名稱相符。只要它們相容,模式匹配就會成功。例如:

記錄客戶(StringfirstName,StringlastName,intage){}

記錄帳戶(客戶客戶,地址地址){}

客戶 customer = 新客戶("John", "Doe", 25);

if (客戶實例 of Customer(var fn, var ln, var Age)) {
System.out.println("名字:" + fn); // 約翰
System.out.println("姓氏:" + ln); // 母鹿
System.out.println("年齡:" + 年齡); // 25
}

// 存取巢狀記錄元件
帳號 account = new Account(customer, new Address("123 Main St", "New York", "NY"));
if (account instanceof Account(var cust, var 位址)) {
System.out.println("客戶:" + cust); // 客戶[名字=約翰,姓氏=多伊,年齡=25]
System.out.println("地址:" + 地址); // 地址[街道=123 Main St, 城市=紐約, 州=紐約]
}

這裡,模式變數「fn」和「ln」與「Customer」記錄中對應的元件名稱「fName」和「lName」不同。這使得記錄模式更加靈活,並避免與變數名稱的任何潛在衝突。

7.結論
總之,Java 記錄模式提供了一種解構記錄並從中提取值的便利方法。它們在處理 instanceof 和 switch 語句中的模式匹配時使程式碼更加簡潔、乾淨和可讀。記錄模式與記錄析構函數結合,可以更穩健地處理複雜記錄。總體而言,此功能增強了記錄作為資料載體的使用,並使 Java 程式設計變得更加愉快。

開發人員可以透過使用 MyExamCloud 的 1Z0-830 練習測驗學習 SE 21 開發人員認證專業考試來發現更多 Java 21 功能。

以上是探索 Java 記錄模式和模式匹配的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!