Java基礎ーラムダ式

ラムダ式

関数型インターフェースを実装するための記述を簡潔に書ける
→抽象メソッドを1つ持つインターフェース

基本形:インターフェース名 オブジェクト名 = (引数1, 引数2, ・・・) -> {処理 ; return 戻り値;};

ラムダ式記入例

// 関数インターフェースの定義
public interface Example {
    public int apply(int x, int y);
}

Example plus = (x, y) -> x + y;
//複数行処理を書くときは`{}`で囲む
Example minus = (x, y) -> {return x - y;};
System.out.println("足し算:" + plus.apply(2, 3)); // 足し算:5
System.out.println("引き算:" + minus.apply(5, 2)); // 引き算:3

java.util.functionパッケージ以下にある関数型インターフェイス

種類 抽象メソッド 説明
Function<T, R> R apply(T t) 実装するメソッドは、引数としてTを受け取り、結果としてRを返す
Consumer<T> void accept(T t) 実装するメソッドは、引数としてTを受け取り、戻り値はなし
Predicate<T> boolean test(T t) 実装するメソッドは、引数としてTを受け取り、boolean値を返す
Supplier<T> T get() 実装するメソッドは、引数は受け取らず、結果としてTを返す
Comparator<T> int compare(T t1, T t2) 引数として2つのTを受け取り、比較した結果としてint値を返す。比較結果が同じなら0を返す

上記インターフェイスを使用した例

Function<Integer, String> func = (i) -> {
    return i + "点";
};
System.out.println(func.apply(10)); //10点

Consumer<String> buy = (goods) -> {
    System.out.println(goods + "を購入しました");
};
buy.accept("プリン"); //プリンを購入しました

Predicate<String> checkStr = (str) -> {
    return str.equals("Java");
};
System.out.println(checkStr.test("Java")); //true

Supplier<String> alert = () -> {
    return "メソッドが実行されました";
};
System.out.println(alert.get()); //メソッドが実行されました

Comparator<Integer> compare = (num1, num2) -> {
    return num2 - num1;
};
System.out.println(compare.compare(15, 15)); //0

ラムダ式の使いどころ

Collections.sort(List<T>, Comparator<? super T>)

Integer[] numbers = { 9, 2, 6, -3, 0 };
List<Integer> list = Arrays.asList(numbers);

Collections.sort(list, (a, b) -> {
    return b - a;
});

for (Integer num : numbers) {
    System.out.println(num);  //9 6 2 0 -3
}

Stream API

Streamについてまとめた記事も投稿しました。

olafnosuke.hatenablog.com