ラムダ式

関数型インターフェース

前回はJavaの関数型インターフェース、Functionについて書きました。

public class Studay {
    public static void main(String[] args) {
        Function<String,Integer> func = new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return s.length();
            };
        };
        System.out.println(func.apply("おはし"));
    }
}

こんなやつ。でも、これを毎回書くのは大変ですね。
ってことで、Javaは関数型インターフェースのオーバーライドを簡潔に記述できるラムダ式が導入されています。

ラムダ式

public class Studay {
    public static void main(String[] args) {
        Function<String,Integer> funcLambda = (s) ->{
            return s.length();
        };
        System.out.println(funcLambda.apply("おはし"));
    }
}

はい!6行あったのが3行に! - インターフェース名を削除 new Function<String, Integer>() - アクセス修飾子を削除 public - 戻り値の型を削除 Integer - メソッド名を削除 apply - 引数の型を削除 (String )

もちろん、抽象メソッドが何個もあったらこんなに削除することはできません。
そんな状態でメソッド名を削除しちゃったら、何をオーバーライドするかわからないしね。
だから、関数型インターフェースは抽象メソッドが1個しかない前提なのかな。

もっと省略

処理が一行だけの場合は、returnと{}も削除できます。この辺はjavascriptのアロー関数と似てますね。

public class Studay {
    public static void main(String[] args) {
        Function<String,Integer> funcLambda = (s) -> s.length();
        System.out.println(funcLambda.apply("おはし"));
    }
}

6行あったのが1行に!ラムダ式、なんて便利な子…。