ホームページ > Java > &#&チュートリアル > Java でラムダ式をマスターするための包括的なガイド

Java でラムダ式をマスターするための包括的なガイド

Patricia Arquette
リリース: 2024-11-03 07:41:03
オリジナル
185 人が閲覧しました

Java のラムダ式の概要

多くの新しい Java バージョンがリリースされているにもかかわらず、Java 8 は、その強力で革新的な機能により、依然として最も広く採用されているバージョンの 1 つです。 Java 8 で導入されたラムダ式は、関数型プログラミングを可能にして Java をより簡潔かつ効率的にするため、特に人気があります。この機能により、開発者は冗長な匿名内部クラスを合理化された構文に置き換えることができるため、コードがより読みやすく、保守しやすくなります。

このガイドでは、ラムダ式がどのようにコードを簡素化し、コレクション内のデータ処理を強化し、Java 開発者が最新のパフォーマンスの高いアプリケーションを作成できるようにするかを説明します。

Mastering Lambda Expressions in Java A Comprehensive Guide

ラムダ式の理解: 基本

本質的に、ラムダ式は、関数型インターフェイスの単一の抽象メソッドをより単純な構文で表現する方法です。この機能は、Single Abstract Method (SAM) の概念と一致しており、単一の未実装メソッドを持つインターフェイスを Lambda 互換として扱うことができます。

ラムダ構文:
ラムダ式は通常、次の 3 つの部分で構成されます。

  1. パラメータリスト – 関数に必要な入力値。
  2. 矢印トークン (->) – パラメーターを関数本体から分離します。
  3. Body – 操作を実行するコード ブロック。式または中括弧で囲まれたコード ブロックにすることができます。
(parameters) -> expression
(parameters) -> { statements; }
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ラムダ式の例:

  • 2 つの整数を受け取り、その合計を返す基本的なラムダ式:
  (int x, int y) -> x + y
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  • 単一の文字列を取得して出力するラムダ式:
  (String message) -> System.out.println(message)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Java のラムダ式の構文は柔軟かつ直観的であるため、開発者は、複数行のコードが必要な場合に、簡潔なワンライナー形式か、より詳細なブロックのいずれかを選択できます。


ラムダ式によって Java コードが簡素化される仕組み

Java 8 より前では、Runnable や Comparator などのインターフェイスを実装するには匿名の内部クラスが必要でした。ラムダ式はこのプロセスを合理化し、定型コードをより機能的なスタイルに置き換えます。以下は、ラムダ式が一般的なタスクをどのように簡略化するかを比較したものです:

例 1: Runnable でのラムダ式の使用

単純な Runnable 実装を考えてみましょう。匿名の内部クラスを使用すると、次のようになります:

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello world one!");
    }
};
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ラムダ式を使用すると、このコードは次のように簡略化できます。

(parameters) -> expression
(parameters) -> { statements; }
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

一般的な関数インターフェイスを使用したラムダ式

Java 8 では、java.util.function パッケージに事前定義された関数インターフェイスのセットが導入されています。これらのインターフェイス (述語、関数、コンシューマー、サプライヤーなど) はラムダ式の基盤を提供し、開発者が関数型プログラミングの原則を活用できるようにします。

  1. Predicate – 条件を表し、入力に基づいて true または false を返します。
  2. 関数 – 1 つの引数を受け入れ、結果を生成します。
  3. Consumer – 結果を返さずに単一の入力に対してアクションを実行します。
  4. サプライヤー – 入力を一切取らずに出力を提供します。

これらのインターフェイスを Lambda 式で使用することにより、Java 開発者は簡潔なだけでなく、再利用性の高い操作を実行できます。


ラムダ式の実際の使用例

ラムダ式の動作を確認するために、ラムダ式がどのように冗長な構文を置き換え、一般的な操作を合理化し、読みやすさを向上させるかを示すいくつかのシナリオを見てみましょう。


実行可能な Lambda の例

Java の Runnable インターフェイスは、スレッドによって実行できるタスクを表します。このクラスは、run という引数のないメソッドを定義する必要があります。 Lambda 式が Runnable 実装を簡素化する方法を次に示します。

匿名の内部クラスで実行可能:

  (int x, int y) -> x + y
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ラムダ式で実行可能:

  (String message) -> System.out.println(message)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ラムダ式を使用すると、5 行のコードが 1 行に減り、Java コードがいかに簡素化されるかが強調されます。


コンパレータラムダの例

Comparator インターフェイスは、コレクションの並べ替えロジックを定義するためによく使用されます。ラムダ式を使用すると、カスタム並べ替え基準の定義がより簡潔かつ直感的になります。

人物のリストを姓で並べ替えるためのコンパレータ:

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello world one!");
    }
};
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ラムダ式を使用すると、比較ロジックを変更することで並べ替え順序を簡単に切り替えることができます (降順など)。

Runnable r2 = () -> System.out.println("Hello world two!");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このアプローチは、動的並べ替えを必要とするアプリケーションで特に役立ち、開発者がユーザー入力やその他の条件に基づいて並べ替え基準を簡単に交換できるようになります。


イベント リスナーでのラムダ式の使用

GUI プログラミングでは、ユーザー アクションを処理するためにイベント リスナーが一般的に使用されます。従来は、匿名の内部クラスが必要であったため、コードが長くなってしまいました。ただし、ラムダ式は、これらのリスナーを実装するためのよりクリーンな方法を提供します。

匿名内部クラスを持つ ActionListener:

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Running with anonymous inner class");
    }
};
r1.run();
ログイン後にコピー
ログイン後にコピー

ラムダ式を使用した ActionListener:

(parameters) -> expression
(parameters) -> { statements; }
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ラムダ式を使用すると、開発者は ActionListener を 1 行で直接実装できるため、可読性が向上し、定型コードが削減されます。


高度な使用例: 述語を使用したフィルタリング

ソフトウェア アプリケーションの一般的なシナリオは、複数の基準に基づいてデータをフィルタリングすることです。 Java では、ラムダ式と Predicate インターフェイスを組み合わせることでこれを効果的に処理でき、コレクションの動的フィルタリングが可能になります。

年齢や性別などのさまざまな基準に基づいてフィルタリングしたい、人物オブジェクトのリストについて考えてみましょう。

述語ベースの SearchCriteria クラスの定義:

  (int x, int y) -> x + y
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

SearchCriteria クラスは、リストをフィルタリングするための一般的な条件をカプセル化し、単一のコレクションにさまざまなフィルタを柔軟に適用できるようにします。

フィルタリングでの基準の使用:

  (String message) -> System.out.println(message)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

このアプローチにより、複数の for ループが不要になり、よりクリーンで再利用可能、より保守しやすいソリューションが提供されます。

Mastering Lambda Expressions in Java A Comprehensive Guide

ラムダ式を使用したスト​​リーム API とコレクション

Java 8 の Stream API は、特に効率的なデータのフィルタリング、変換、集計を可能にする Lambda 式を使用して、コレクションの処理方法に革命をもたらします。ストリームを使用すると、必要な場合にのみデータが処理される遅延処理が可能になり、大規模なデータセットのパフォーマンスが向上します。

forEach によるループ

Stream API の forEach メソッドは、従来の for ループの代替手段を提供し、コレクション内の各要素にラムダ式を適用できるようにします。以下は、Person オブジェクトのリストを反復処理する例です。

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello world one!");
    }
};
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

メソッド参照の使用:
既存のメソッドを再利用できる場合、Java では、読みやすさを向上させる省略表現であるメソッド参照が許可されています。

Runnable r2 = () -> System.out.println("Hello world two!");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

フィルタリング、マッピング、収集

Stream API を使用すると、操作を連鎖させることができるため、開発者は 1 つのステートメントで結果をフィルタリング、マッピング、収集できます。

例: フィルタリングと収集:

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Running with anonymous inner class");
    }
};
r1.run();
ログイン後にコピー
ログイン後にコピー

このコードは、SearchCriteria クラスで定義された条件を使用して、18 ~ 25 歳の男性のみをフィルターします。

マップを使用したマッピングと変換:
map メソッドは、プロパティを抽出または変更するなどして、コレクション内の各要素を変換します。

Runnable r2 = () -> System.out.println("Running with Lambda Expression");
r2.run();
ログイン後にコピー

計算にマップを使用する:
mapToInt メソッドと mapToDouble メソッドは数値計算に役立ちます。

(parameters) -> expression
(parameters) -> { statements; }
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ストリームの怠惰と熱心さを理解する

ストリームは遅延操作と積極的な操作をサポートしており、遅延操作 (フィルターなど) は必要な場合にのみ適用されます。この遅延により、必要な要素のみを処理することでパフォーマンスが最適化されます。

  1. 遅延操作: ターミナル操作 (収集など) に達した場合にのみ適用されます。
  2. Eager Operations: すべての要素に対して即時に実行され、一般に集計に使用されます。

遅延評価の例:

  (int x, int y) -> x + y
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

年齢が 30 歳を超える人のみが処理され、姓が出力され、遅延フィルタリングが示されています。


ストリームによる並列処理

Java のParallelStream メソッドはタスクを複数のスレッドに分散し、大規模なデータ セットのパフォーマンスを大幅に向上させます。

並列ストリームの例:

  (String message) -> System.out.println(message)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

並列処理によりワークロードが分割され、計算負荷の高いタスクのコレクション操作が高速化されます。

突然変異と結果の収集

ストリームは本質的に不変であるため、結果を保持するには結果を収集する必要があります。 collect メソッドは、ストリーム操作の結果を集約して保持する方法を提供します。

:

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello world one!");
    }
};
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここでは、フィルタリングされた結果がさらなる処理のためにリストに保存され、開発者が構造化された方法で複雑なデータ フローを管理できるようになります。

Mastering Lambda Expressions in Java A Comprehensive Guide

結論: Java 8 におけるラムダ式の威力

Java 8 の Lambda 式と Stream API を組み合わせると、関数型プログラミングへの大きな変化が表れ、コードがより簡潔で表現力豊かになり、保守しやすくなります。匿名内部クラスの置き換え、コレクション処理の強化、並列操作のサポートにより、ラムダ式は最新の Java アプリケーションを作成するための基礎となりました。

この投稿に対する修正や追加は大歓迎です。

読んでいただきありがとうございます!

Runnable r2 = () -> System.out.println("Hello world two!");
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

以上がJava でラムダ式をマスターするための包括的なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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