Java 8で導入されたラムダ式の使い方と活用方法

java

 

ラムダ式について名前は聞いたことあるけど
詳しくわからない。。。

 

ラムダ式は、Java 8で導入された機能で、
関数型プログラミングをサポートするために追加されたよ!

 

この記事では、Javaのラムダ式について詳しく説明し、その使い方について解説します!

 

ラムダ式とは

ラムダ式は、無名関数を定義する方法です!

無名関数とは、
名前を持たずに実行できる関数のことで、通常の関数と同じように引数を受け取り、戻り値を返します
関数とは、
入力(引数)を受け取り、何らかの処理を行い、出力(戻り値)を返す処理のまとまりのことです

Javaでは、従来、クラス内にメソッドを定義することで関数を定義していましたが、
ラムダ式では、関数を簡潔かつ直接的に定義することができます

ラムダ式は、単一の式または文のブロックから構成されます。
関数型インターフェースとともに使用されます。

 

ラムダ式の構文

ラムダ式は、以下のような構文を持ちます。

// 引数     // 処理
(parameters) -> expression

または

// 引数     // 処理
(parameters) -> { statements; }

 

ここで、parametersは引数のリスト、expressionは単一の式、statementsは複数のステートメントです。
引数のリストが空の場合、空のカッコ()を指定します。また、型宣言は省略可能です。以下に例を示します。

// 単一の式を持つラムダ式
MyFunction add = (x, y) -> x + y;

// 複数の文を持つラムダ式
MyFunction multiply = (x, y) -> {
    int result = x * y;
    return result;
};

 

比較して理解する

ラムダ式を使ったソースコードと使わないソースコードの比較をします!

【ラムダ式を使った例】

List numbers = Arrays.asList(1, 2, 3, 4, 5);

numbers.forEach((Integer number) -> {
    System.out.println(number);
});

 

【ラムダ式を使わない例】

List numbers = Arrays.asList(1, 2, 3, 4, 5);

for (Integer number : numbers) {
    System.out.println(number);
}

 

実行結果

1
2
3
4
5

例では、リストの要素を順に取り出して、それぞれを標準出力に出力するというタスクを実行するプログラムを比較しています。

ラムダ式を使った場合forEach メソッドに引数としてラムダ式を渡しています。ラムダ式内で、引数として渡されたリストの要素を受け取り、それを標準出力に出力しています。このコードは、コンパクトで簡潔なため、可読性が高く、Java 8以降のバージョンでのみ使用可能です。

ラムダ式を使わない場合for ループを使用してリストの要素を順に取り出しています。このコードは、古いバージョンのJavaでも使用可能ですが、ラムダ式を使った場合よりも行数が多くなり、可読性が低くなる可能性があります。

このように、ラムダ式を使用することで、コードをより簡潔かつ直接的に表現することができ、可読性を高めることができます。

 

関数型インターフェース

ラムダ式は、関数型インターフェースとともに使用されます!

関数型インターフェースとは、単一の抽象メソッドを持つインターフェースのことです。

 

Javaでは、java.util.functionパッケージに多くの関数型インターフェースが用意されています。

例えば、以下のようなインターフェースがあります。

@FunctionalInterface
interface MyFunction {
    int apply(int x, int y);
}

 

このインターフェースは、引数を2つ受け取り、整数を返す apply メソッドを定義しています。このインターフェースを実装するには、通常の方法でクラスを定義するか、ラムダ式を使用してインスタンスを作成することができます。

例えば、以下のように MyFunction インターフェースのインスタンスを作成することができます。

MyFunction add = (x, y) -> x + y;
MyFunction multiply = (x, y) -> x * y;

add インスタンスは、2つの引数を受け取り、それらを加算して結果を返します。
multiply インスタンスは、2つの引数を受け取り、それらを乗算して結果を返します。これらのインスタンスは、関数として使用することができます。

 

例えば、add インスタンスを使用して、2つの整数を加算することができます。

int result = add.apply(3, 5);  // 結果は 8

apply メソッドに引数を渡して呼び出すことで、関数を実行し、その結果を取得することができます。

このように、ラムダ式と関数型インターフェースを使用することで、簡潔かつ直接的に関数を定義し、再利用性を高めることができます!

 

ラムダ式のメリット

ラムダ式は、以下のようなメリットがあります。

  • コードが簡潔かつ直接的に表現できるため、可読性が向上します。
  • クラスを定義する必要がないため、コードの行数を減らすことができます。
  • コードが短くなるため、エラーの可能性が減ります。
  • コードがシンプルになるため、メンテナンス性が向上します。

 

ラムダ式の使用例

ラムダ式は、多くの場面で使用されます。以下に、ラムダ式を使用する代表的な例を示します。

 

ストリームAPI

Java 8では、ストリームAPIが導入され、データのフィルタリング、変換、集計などを簡単に実現できるようになりました。ストリームAPIは、ラムダ式を使用して実装されており、以下のようなコードで使用されます。

List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().filter(x -> x % 2 == 0).mapToInt(Integer::intValue).sum();

 

このコードは、整数のリストから偶数だけをフィルタリングし、その合計値を計算するものです。ラムダ式 x -> x % 2 == 0 は、数値を受け取り、偶数かどうかを判定するために使用されます。

 

イベントリスナーの実装

GUIアプリケーションでは、ボタンやメニューなどのコンポーネントに対するイベントリスナーを実装する必要があります。
ラムダ式を使用すると、イベントリスナーの実装を簡潔に表現することができます!

button.addActionListener(e -> {
    // ボタンが押されたときに実行される処理
});

 

このコードは、ボタンに対するイベントリスナーを実装しています。ラムダ式 e -> { ... } は、イベントオブジェクトを受け取り、ボタンが押されたときに実行される処理を表現しています!

 

並行処理

Javaでは、マルチスレッドプログラミングをサポートしており、複数のスレッドを使用して処理を並行して実行することができます。ラムダ式を使用すると、並行処理を簡単かつ直接的に実現することができます。

ExecutorService executor = Executors.newCachedThreadPool();
executor.submit(() -> {
    // 並行して実行される処理
});

 

このコードは、キャッシュされたスレッドプールを使用してスレッドを生成し、ラムダ式を使用して処理を実行しています!

<用語>
スレッドプールとは、
スレッドの生成と管理を行うための機構であり、スレッドの再利用性を高めることができます。

スレッド
とは、
プログラムの実行単位であり、複数のスレッドを使用することで、複数のタスクを同時に実行することができます。

 

まとめ

Javaのラムダ式は、関数型プログラミングをサポートするために導入された機能であり、コードを簡潔かつ直接的に表現することができます。

関数型インターフェースとともに使用され、ストリームAPIイベントリスナーの実装並行処理など、多くの場面で活用されています。

ラムダ式を使用することで、コードの行数を減らし、可読性を向上させ、メンテナンス性を高めることができます!

 

最後まで、見ていただきありがとうございます!!!

 

 

 

コメント

PAGE TOP
タイトルとURLをコピーしました