「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Java レコード パターンとパターン マッチングの探索

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

2024 年 8 月 23 日に公開
ブラウズ:145

Exploring Java Record Patterns and Pattern Matching

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

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

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

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

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

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

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("姓: " lastName); // スミス
System.out.println("年齢: " 年齢); // 30
}

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

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

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

インターフェイス アカウント {}

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

アカウント アカウント = 新しい CreditCardAccount(10000, 1000);

スイッチ (形状) {

ケース SavingAccount s:
System.out.println("口座残高は " 残高です);
壊す;
ケースのクレジットカードアカウント 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(Customer(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.コンポーネントのマッチング

レコード パターンを使用すると、パターン変数がレコードのコンポーネント名と一致する必要がないため、柔軟性が高まります。互換性がある限り、パターン マッチングは成功します。例えば:
レコード顧客(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 の機能をさらに発見できます。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/myexamcloud/exploring-java-record-patterns-and-pattern-matching-3g8l?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>
  • フローティングされた Div が後続の Div のサイズを変更しないのはなぜですか?
    フローティングされた Div が後続の Div のサイズを変更しないのはなぜですか?
    Div のサイズが変更されない Float の謎CSS float を使用する場合、後続の要素は新しい要素に流れるのではなく左に揃えられると想定されます。ライン。ただし、提供されている例など、一部のシナリオでは、次の div が最初の div の右側から始まるのではなく、幅全体に広がり続けます。この...
    プログラミング 2024 年 11 月 8 日に公開
  • Python を使用して MySQL にデータをインポートする
    Python を使用して MySQL にデータをインポートする
    導入 データベースにデータを手動でインポートするのは、特に多数のテーブルがある場合、面倒なだけでなく時間がかかる場合があります。これは、Python ライブラリを使用すると簡単に行うことができます。 kaggle からペイント データセットをダウンロードします。絵画データ セットは...
    プログラミング 2024 年 11 月 8 日に公開
  • 必須の MySQL オペレーターとそのアプリケーション
    必須の MySQL オペレーターとそのアプリケーション
    MySQL 演算子は、開発者にとって重要なツールであり、正確なデータ操作と分析を可能にします。これらは、値の割り当て、データ比較、複雑なパターン マッチングなどのさまざまな機能をカバーします。 JSON データを処理する場合でも、条件に基づいてレコードをフィルタリングする場合でも、効率的なデータベー...
    プログラミング 2024 年 11 月 8 日に公開
  • Cron ジョブをテストする方法: 完全ガイド
    Cron ジョブをテストする方法: 完全ガイド
    Cron ジョブは、タスクのスケジュール設定、プロセスの自動化、および指定された間隔でのスクリプトの実行のために、多くのシステムで不可欠です。 Web サーバーの保守、バックアップの自動化、定期的なデータ インポートの実行など、cron ジョブにより操作がスムーズに実行されます。ただし、他の自動化...
    プログラミング 2024 年 11 月 8 日に公開
  • Next.js ミドルウェアの概要: 例を使用した仕組み
    Next.js ミドルウェアの概要: 例を使用した仕組み
    Nextjs のルーティングについて話しましょう。今日は、最も強力なミドルウェアの 1 つについて説明します。 Nextjs のミドルウェアは、サーバーからのリクエストをインターセプトし、リクエスト フロー (リダイレクト、URL 書き換え) を制御し、認証、ヘッダー、Cookie の永続性などの機...
    プログラミング 2024 年 11 月 8 日に公開
  • 小道具の基本: パート 1
    小道具の基本: パート 1
    これは、プロップの使用方法に関する初心者向けのチュートリアルです。読む前に、分割とは何か、コンポーネントの使用/作成方法を理解することが重要です。 Props (プロパティの略) を使用すると、親コンポーネントから子コンポーネントに情報を送信できます。また、任意のデータ型を使用できることに注意する...
    プログラミング 2024 年 11 月 8 日に公開
  • Hibernate は Spring Boot とどう違うのですか?
    Hibernate は Spring Boot とどう違うのですか?
    Hibernate は Spring Boot とどう違うのですか? Hibernate と Spring Boot は両方とも Java エコシステムで人気のあるフレームワークですが、異なる目的を果たし、異なる機能を備えています。 休止状態 Hibernate は...
    プログラミング 2024 年 11 月 8 日に公開
  • C++ は 10 進データ型をどのように処理できますか?
    C++ は 10 進データ型をどのように処理できますか?
    C の 10 進データ型 C では、数値を処理するためのさまざまなデータ型が提供されていますが、驚くべきことに、10 進データ型はネイティブではサポートされていません。これは、正確な 10 進数値を扱う場合、または 10 進形式を利用するシステムとインターフェイスする場合に制限となる可能性があります...
    プログラミング 2024 年 11 月 8 日に公開
  • Python の Caesar 暗号関数で最後にシフトされた文字だけが表示されるのはなぜですか?
    Python の Caesar 暗号関数で最後にシフトされた文字だけが表示されるのはなぜですか?
    Python の Caesar 暗号関数: 暗号化された文字列Python で Caesar Cipher 関数を実装する場合、最終的な暗号化されたテキストが暗号化されるという一般的な問題が発生します。最後にシフトされた文字のみを表示します。これを解決するには、この動作の原因となっている問題を理解す...
    プログラミング 2024 年 11 月 8 日に公開
  • 4 での PHP の迅速な導入
    4 での PHP の迅速な導入
    Servbay は、開発環境を簡単に構成するための主要なツールとしての地位を確立しています。このガイドでは、PHP 8.2 を迅速かつ安全に導入する方法を示し、導入プロセスの簡素化に対する Servbay の取り組みを強調します。 前提条件 始める前に、Servbay がデバイスにイ...
    プログラミング 2024 年 11 月 8 日に公開
  • replace プロパティが AngularJS ディレクティブで非推奨になったのはいつですか?
    replace プロパティが AngularJS ディレクティブで非推奨になったのはいつですか?
    AngularJS がディレクティブの replace プロパティを非推奨にした理由AngularJS ディレクティブの replace プロパティは、その複雑さとより優れたプロパティの出現により非推奨になりました代替案。公式 AngularJS API ドキュメントによると、将来のバージョンではデ...
    プログラミング 2024 年 11 月 8 日に公開
  • JavaScript および jQuery で PHP 変数にシームレスにアクセスするにはどうすればよいですか?
    JavaScript および jQuery で PHP 変数にシームレスにアクセスするにはどうすればよいですか?
    JavaScript または jQuery での PHP 変数へのアクセス: エコー オーバーロードの回避多くの開発者は、JavaScript や jQuery で PHP 変数にアクセスするという課題に直面しています。従来の方法では、次のように PHP タグ内の変数をエコーし​​ます。<?p...
    プログラミング 2024 年 11 月 8 日に公開
  • Claude AI を解き放つ: 手頃な価格で柔軟な AI 統合のための非公式 API
    Claude AI を解き放つ: 手頃な価格で柔軟な AI 統合のための非公式 API
    Anthropic が開発した Claude AI は、その優れた機能で AI コミュニティに波紋を広げています。ただし、公式 API は、多くの開発者や中小企業にとって法外に高価になる可能性があります。そこで私たちの 非公式 Claude AI API が登場し、Claude のパワーをプロジェク...
    プログラミング 2024 年 11 月 8 日に公開
  • Time パッケージを使用して Go で月の最終日を決定する方法は?
    Time パッケージを使用して Go で月の最終日を決定する方法は?
    Time.Time を使用した特定の月の最終日の決定時間ベースのデータを扱う場合、多くの場合、特定の月の最後の日。月が 28 日、29 日 (うるう年)、あるいは 30 日、31 日であっても、これは困難な作業になる可能性があります。タイム パッケージ ソリューションGo タイム パッケージDate...
    プログラミング 2024 年 11 月 8 日に公開
  • 「backdrop-filter」効果をサポートしていないブラウザでどのように実現できますか?
    「backdrop-filter」効果をサポートしていないブラウザでどのように実現できますか?
    CSS: 使用できない背景フィルターの代替手段を提供するCSS の背景フィルター機能は、ほとんどの最新のブラウザーでは依然としてアクセスできません。将来のサポートを期待していますが、代替ソリューションの発見が不可欠になります。同様の効果を達成する 1 つの方法は、微妙な透明度を持つ背景を使用すること...
    プログラミング 2024 年 11 月 8 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3