読者です 読者をやめる 読者になる 読者になる

見つけたことをぶん投げる所

jsをメインとした記事を投げる予定。qiitaでやれ事案

java のラムダ式の仕様に惚れた

java で大規模な開発はした事が無いのですが、ちらっと javaラムダ式について調べて少し感動したので自分用メモ

まず、java8 のラムダ式について

ラムダ式は実体を持っています。
ということは、必然的に何かしらの型の元に定義されなければなりません。

という事で、以下のように書ける仕様になっています:

interface Func {
    void apply();
}

public class Main {
    public static void main(String[] args) {
        Func sayHi = () -> {
            System.out.println("Hi!");
        };
        sayHi.apply();
    }
}

Func 型には apply というメソッドが含めるようにしておいたとき、その Func 型にラムダ式を代入すると、その式は apply メソッドに割り当てられる仕様になってます。

つまり、どこがポイントかというと「javaがどのメソッドラムダ式を割り当てるかを勝手に決めてくれる」という事です。

この実装を使えば美しくメソッドチェーンが作れる

具体例を見ていきましょう。

public class Main {

    public static void main(String[] args) {
        A f = x -> y -> z -> {
            int sum = x + y + z;
            return sum;
        };
        System.out.println(f.a(1).b(7).c(9));
    }

    public interface A {
        public B a(int x);
    }

    public interface B {
        public C b(int x);
    }

    public interface C {
        public int c(int x);
    }

}

A -> B -> C -> int と推移できるようにインターフェースを用意して、それを満たすようなラムダ式を埋めてみました。
すると自動的にラムダ式を適切なメソッドに割り当ててくれます。
カリー化みたいな定義の仕方が楽しいですね

欠点

お気づきかもしれないですが、上の例でこんな感じに書くとエラーが吐かれます:

public interface A {
    public B a(int x);
    public B illegal(int x);
}

とても当たり前なんですが、ラムダ式をどのメソッドに割り振れば良いか java が判断できないからです。
引数の数とかで判断できるので多重定義くらいはさせてくれてもいいんじゃないの?って思ったんですけど、それも無理そうです