Java(jdk1.8以降)のラムダ式について、簡単にまとめたものです。
1. ラムダ式の例
以下のインターフェースがあるとします。
Calculation.java
package test;
@FunctionalInterface
public interface Calculation {
public int add(int x, int y);
}
1.1. ラムダ式を使用しない場合(匿名クラス)
ラムダ式を使用しない場合、上記のインターフェースを使用するには、以下のように匿名クラスでaddメソッドをオーバーライドして呼び出します。
NotLambdaMain.java
package test;
public class NotLambdaMain {
public static void main(String[] args) {
// 匿名クラスでメソッドをオーバーライド
Calculation obj = new Calculation() {
@Override
public int add(int x, int y) {
System.out.println("テスト");
return x + y;
}
};
// Calculationのaddメソッドの呼び出し
System.out.println(obj.add(3, 6));
}
}
実行結果
テスト
9
1.2. ラムダ式を使用した場合
ラムダ式を使用する場合は、以下のように記述することができます。
LambdaMain.java
package test;
public class LambdaMain {
public static void main(String[] args) {
// ラムダ式で記述
Calculation obj = (x, y) -> {System.out.println("テスト"); return(x + y);};
// Calculationのaddメソッドの呼び出し
System.out.println(obj.add(3, 6));
}
}
実行結果
テスト
9
上記でSystem.out.println("テスト");
の処理が不要な場合、以下のように記述することができます。
LambdaMain2.java
package test;
public class LambdaMain2 {
public static void main(String[] args) {
// ラムダ式で記述
Calculation obj = (x, y) -> x + y;
// Calculationのaddメソッドの呼び出し
System.out.println(obj.add(3, 6));
}
}
実行結果
9
2. あらかじめ用意されている関数型インターフェース
ラムダを使用する際に関数型インターフェースを用意しなくていいように、パッケージjava.util.function
に関数型インターフェースがあらかじめ用意されています。
代表的なものとして、以下の関数型インターフェースが用意されています。
関数型インターフェース | 関数メソッド | 説明 |
---|---|---|
Supplier<T> | T get() | 引数は受け取らずに、型(T)の戻り値を返す。 |
Consumer<T> | void accept(T) | 型(T)の引数を受け取って、戻り値を返さない。 |
Function<T, R> | R apply(T) | 型(T)の引数を受け取って、型(R)の戻り値を返す。 |
Predicate<T> | boolean test(T) | 型(T)の引数を受け取って、boolean値を返す。 |
上記の関数型インターフェースをラムダ式で使用する場合のサンプルは以下となります。
Sample.java
package test;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
public class Sample {
public static void main(String[] args) {
// Supplier<T>のサンプル
Supplier<String> obj1 = () -> "Supplier<T>のテスト";
System.out.println(obj1.get());
// Consumer<T>のサンプル
Consumer<String> obj2 = a -> System.out.println(a + "のテスト");
obj2.accept("Consumer<T>");
// Function<T, R>のサンプル
Function<Integer, String> obj3 = a -> "Function<T, R>のテスト: " + String.valueOf(a);
System.out.println(obj3.apply(5));
// Predicate<T>のサンプル
Predicate<String> obj4 = a-> a.equals("test");
if (obj4.test("test")) {
System.out.println("Predicate<T>のテスト");
}
}
}
実行結果
Supplier<T>のテスト
Consumer<T>のテスト
Function<T, R>のテスト: 5
Predicate<T>のテスト
以上