ラムダ式
関数型インターフェースを実装するための記述を簡潔に書ける
→抽象メソッドを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についてまとめた記事も投稿しました。