ラムダ式(Lambda Expression)

ラムダ式は関数をより簡潔にコーディングするため機能です。

ラムダ式について

ラムダ式は多くの言語で採用されている構文で、JavaではJavaSE8で導入されました。

ラムダ式は関数型インターフェースを実装するための構文なので、関数型インターフェースが存在することが前提になります。 Javaではよく使用される形式の関数型インターフェースは標準で用意されているので、用意された関数型インターフェースを使用してもよいですし、 関数型インターフェースを独自に定義して使用しても構いません。

標準で用意されている関数型インターフェースは以下記事をご覧ください。
標準関数型インターフェース一覧

ラムダ式構文

(ラムダ式構文)
(型 実装するメソッドの引数) -> { 処理 };

上記はラムダ式の最も基本的な構文で、条件によりさらに簡略化して記述することが可能です。
※詳細は、下記「ラムダ式の省略記法」欄をご覧ください。

ラムダ式サンプル

ラムダ式を用いたサンプルです。

(例)関数型インターフェースGreetInfをラムダ式で実装し、実行する

// 関数型インターフェース
interface GreetInf {
  void sayHello(String str);
}

public class SampleClass {
  public static void main(String[] args) {
 
    //ラムダ式を用いてGreetInfを実装する
    GreetInf g = (String str) -> {
      System.out.println("Hello, " + str);
    };

    //実装したGreetInfを実行
    g.sayHello("Taro");
  }
}
(実行結果)
C:\>java SampleClass Hello, Taro

10行目~12行目でGreetInfインターフェースの実装とインスタンス化を行っています。
さらに15行目でインスタンス化したオブジェクトのメソッドを呼び出しています。

ラムダ式の省略記法

ラムダ式は、パラメータや処理の内容によりさらに簡略化して記述することができます。
以下は簡略化できる条件と簡略化した書き方についてです。

パラメータの型の省略

ラムダ式のパラメータの型は、関数型インターフェースから判別できるため省略可能です。

(パラメータの型を省略する例)

//パラメータの型を省略しない例
MyInf1 mi1 = (String a, String b) -> {a + b};

//パラメータの型を省略した例
MyInf1 mi1 = (a, b) -> {a + b};

単一パラメータの括弧省略

パラメータが1つだけの場合、そのパラメータの括弧を省略できます。

(単一パラメータの括弧を省略する例)

//パラメータの括弧を省略しない例
MyInf2 mi2 = (str) -> {System.out.println(str);};

//パラメータの括弧を省略した例
MyInf2 mi2 = str -> {System.out.println(str);};

単一式の本体省略

ラムダ式の本体が1つの式だけで構成される場合、中括弧とreturn句を省略できます。

(単一式の本体を省略する例)

//パラメータの中括弧とreturn句を省略しない例
MyInf3 mi3 = (a, b) -> {
  return a + b;
};

//パラメータの中括弧とreturn句を省略した例
MyInf3 mi3 = (a, b) -> a + b;

メソッド参照

ラムダ式が既存のメソッド呼び出しと一致する場合、メソッド参照が使用できます。

(メソッド参照を使用した例)

//メソッド参照を使用せずに標準出力を呼び出す例
MyInf4 mi4 = (String str) -> {System.out.println(str);};

//メソッド参照を使用して標準出力を呼び出す例
MyInf4 mi4 = System.out::println;

ラムダ式まとめ

  • Java SE8で導入された関数型プログラミングのための機能
  • 実装するための関数型インターフェースが必須
  • 関数型インターフェースは標準で用意されているものを使用しても独自で作成してもどちらでもOK
  • パラメータや処理の内容により、さらに簡略化して記述することが可能
  • 戻り値があるラムダ式でカッコで括った場合はreturnが必須。
    (例)
    ✕ test(list, s -> {s.getNum() > 20});
    ○ test(list, s -> {return s.getNum() > 20});

コメント

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