ホームページ > Java > &#&チュートリアル > Java レコード パターンとパターン マッチングの探索

Java レコード パターンとパターン マッチングの探索

WBOY
リリース: 2024-08-17 19:04:31
オリジナル
873 人が閲覧しました

Exploring Java Record Patterns and Pattern Matching

Java レコード パターンは、Project Amber の一部として Java 16 で導入され、Java 21 ではデコンストラクターとパターン マッチングが追加されて拡張されました。この機能により、Java アプリケーションでデータをより簡潔かつ柔軟に処理できるようになります。このチュートリアルでは、レコード パターンの概念、それがパターン マッチングにどのように役立つか、およびさまざまなコーディング例について説明します。

1. Java レコードの簡単な要約
レコード パターンに入る前に、Java レコードについて簡単にまとめてみましょう。レコードは、不変データを保持するために特別に設計された新しいタイプのクラスとして Java 14 に導入されました。データを使用してクラスを定義するためのより簡潔な構文が提供されるため、定型コードを記述する必要がなくなります。次の例では、名、姓、年齢の 3 つのフィールドを持つ「人」という名前のレコードを定義します。

レコード Person(String firstName, String lastName, int age) {}

レコードは不変であるため、特定の特性を制限します:

  • すべてのフィールドは最終的なものです
  • クラスは暗黙的に最終的なものです
  • インスタンスフィールドの宣言は禁止されています

レコードは各フィールドのコンストラクター メソッドとゲッター メソッドを自動的に生成するため、従来のクラスよりもデータ キャリアに適しています。

2.レコードパターンとは何ですか?
Java 21 で導入されたレコード パターンは、パターンの概念とレコードを組み合わせたもので、レコードの値を簡単に分解して抽出できるようにします。レコード パターンは、レコード クラス タイプと、テストが成功した場合にのみターゲット レコードから抽出された値が割り当てられるオプションのパターン変数で構成されます。

null 値はどのレコード パターンにも一致しないため、この場合、パターン変数は初期化されません。

3.レコード デストラクター
デストラクターはコンストラクターの逆です。値を追加するのではなく、オブジェクトから値を抽出します。レコードのコンテキストでは、デストラクターは「デコンストラクター」と呼ばれます。これにより、レコード値を個々のコンポーネントに分解できます。次のフィールドを持つ「Name」という名前のレコードがあるとします:

レコード Customer(String firstName, String lastName, int age) {}

次の例に示すように、デコンストラクターを使用して、「Customer」レコードのインスタンスからこれらのフィールドの値を抽出できます。

顧客 customer = new Customer("Jane", "Smith", 30);

if (顧客インスタンスof Customer(String firstName, String lastName, int age)) {
System.out.println("名: " + firstName); // ジェーン
System.out.println("姓: " + 姓); // スミス
System.out.println("年齢: " + 年齢); // 30
}

レコード構造は、複数の関連する値を 1 つのオブジェクトとして保存および取得する必要がある状況で役立ちます。レコードの分解機能を使用すると、それらの値をコードで簡単に抽出して使用できます。

4. Switch ステートメントのパターンを記録する
Java 16 では、instanceof ステートメントのパターン マッチングが導入されました。これは Java 21 でさらに拡張され、switch ステートメントが含まれます。これにより、複数のパターンを処理しながら、より簡潔で読みやすいコードが可能になります。

「SavingAccount」、「CreditCardAccount」、「HomeLoanAccount」という 3 つのサブタイプを持つ「Account 」という名前のレコードがあるとします。各サブタイプには、バランスの計算方法が異なります。以下に示すように、switch ステートメントでレコード パターンを使用して、これら 3 つのケースを処理できます。

インターフェースアカウント {}
レコード SavingAccount (二重残高) はアカウント {}
を実装します レコード CreditCardAccount(double CreditLimit, double used) はアカウント {}
を実装します レコード HomeLoanAccount(double totalAmount, double amountPaid) はアカウント {}

を実装します

アカウント account= new CreditCardAccount(10000, 1000);

スイッチ (形状) {
ケース SavingAccount s:
System.out.println("アカウント残高は " + 残高);
休憩;
case CreditCardAccount c:
System.out.println("クレジット残高は次のとおりです: " + (creditLimit-used));
休憩;
ケース住宅ローン口座 h:
System.out.println("残高 " +(合計金額-支払金額));
休憩;
デフォルト:
System.out.println("不明なアカウント");
}

5.ネストされたパターン
単一レコードから値を抽出するだけでなく、レコード パターンをネストして、より複雑なレコードを処理することもできます。 「Account」という名前のレコードがあり、そのレコードには「Customer」タイプのフィールドと「Address」タイプの別のフィールドがあるとします。次の例に示すように、ネストされたレコード パターンを使用して、これらのフィールドの両方から値を抽出できます。

レコード Customer(String firstName, String lastName, int age) {}

レコードアカウント(顧客の顧客、住所アドレス) {}

顧客 customer = new Customer("John", "Doe", 25);
住所 address = new Address("123 Main St.","市", "州");
アカウント account = 新しいアカウント(顧客、住所);

if (アカウントインスタンス Account(顧客(fName, lName, age), Address(番地, 都市, 州))) {
System.out.println("名: " + fName); // ジョン
System.out.println("姓: " + lName); // ドウ
System.out.println("年齢: " + 年齢); // 25
System.out.println("住所: " + 番地 + ", " + 都市 + ", " + 州); // 123 Main St.、市、州
}

この例では、2 つのネストされたパターンを使用して、「Account」レコードの「Customer」フィールドと「Address」フィールドから値を抽出します。

6.コンポーネントのマッチング
レコード パターンを使用すると、パターン変数がレコードのコンポーネント名と一致する必要がないため、柔軟性が高まります。互換性がある限り、パターン マッチングは成功します。例:

レコード Customer(String firstName, String lastName, int age) {}

レコードアカウント(顧客の顧客、住所アドレス) {}

顧客 customer = new 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 (アカウントインスタンスのアカウント(var cust, var address)) {
System.out.println("顧客: " + cust); // 顧客[名=ジョン、姓=ドウ、年齢=25]
System.out.println("アドレス: " + アドレス); // 住所[ストリート=123 メインストリート、都市=ニューヨーク、州=ニューヨーク]
}

ここで、パターン変数「fn」と「ln」は、「Customer」レコードの対応するコンポーネント名「fName」と「lName」とは異なります。これにより、レコード パターンがより柔軟になり、変数名との潜在的な競合が回避されます。

7.結論
結論として、Java レコード パターンは、レコードを分解し、そこから値を抽出する便利な方法を提供します。これにより、instanceof ステートメントと switch ステートメントでのパターン マッチングを処理しながら、コードがより簡潔でクリーンで読みやすくなります。レコード パターンをレコード デストラクターと組み合わせると、複雑なレコードをより堅牢に処理できるようになります。全体として、この機能によりデータ キャリアとしてのレコードの使用が強化され、Java プログラミングがより快適になります。

開発者は、MyExamCloud の 1Z0-830 模擬テストを使用して SE 21 Developer Certified Professional 試験の勉強をすることで、Java 21 の機能をさらに発見できます。

以上がJava レコード パターンとパターン マッチングの探索の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート