menu
書いてる野郎
orebike@gmail.com
ラムダを引数に取れるメソッドは関数的インタフェースで受ける必要がある。 しかしラムダを利用する度にそのようなインタフェースを作るのは面倒なので、標準的なインタフェースがもうすでに用意されている。 これらのインタフェースはジェネリクスによって柔軟に利用できるようになっているので、それを利用すれば自分で関数的インタフェースを作る手間が省ける。
ここにはざっと4つ挙げているが、これと似たようなインタフェースが java.util.function
以下に山のように定義されているのでそれを覗いてみるとよい。
柔軟にとあるが、例外処理は仕様上柔軟にできないので、それが必要ならば自力で書くことになる。
ある固定値を外部入れしたい場合に使う。
インタフェース Supplier 自体は get というメソッドを1個だけ持っていてそれを内部で使うように実装する。
public class Fuga { public String gogogo(Supplier<String> p) { return p.get() + "gogogo"; } }
この標準搭載の関数型インタフェースはすべてジェネリクスを使って型を柔軟に定義できるようになっている。 なので、実装時に型パラメータを与えて、自分の用途に合わせて固定化する。
使うときはこうなる
Fuga f = new Fuga(); String ggg = f.gogogo(() -> { return "aaa"; }); System.out.println(ggg); // "aaagogogo"
対象からデータを取り出しに副作用のある処理を後入れする。 対象のデータを使って外部の変数のインスタンスに対して影響を及ぼす処理を書く場合に使う。 外部の変数はラムダ式内では再代入不可能なので、外部に変数を用意してその結果を入れ込むような処理はできない。
インタフェース Consumer 自体は accept というメソッドを1個だけ持っていてそれを内部で使うように実装する。
public class Fuga { public String v; public void gogogo(Consumer<String> p) { p.accept(this.v); } }
使うときはこうなる
Fuga f = new Fuga(); f.v = "aaa"; f.gogogo((a) -> { System.out.println(a + a); }); // "aaaaaa";
public class Fuga { public void gogogo(Fucntion<String, Long> p) { p.apply("12345"); } }
使うときはこうなる
Fuga f = new Fuga(); long ggg = f.gogogo((a) -> { return Long.valueOf(a) + 1; }); System.out.println(ggg); // 12346