#はじめに
この記事は基本の関数型インタフェースの実装例を紹介した記事です。
普通はラムダ式で実装したり、Streamの中で使ったりすると思いますが、単純にするためにあえてそのへんを使わずにおなじみのメソッドを使っています。
"メソッドが変数に入る"っていう感覚をつかめればいいなぁと思って。(厳密にはクラスですが)
java.util.functionパッケージには43の関数型インタフェースが定義されていますが、まず抑えておくべきは基本の4つです。この4つ以外は、これらの拡張型だと思っといて問題ないです。
#Supplier
何かを持ってて、与えてくれる人。抽象メソッドはget。引数なし、戻り値あり。
import java.time.LocalDateTime;
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
Supplier<LocalDateTime> s = LocalDateTime::now;
System.out.println(s.get()); // -> 2017-01-11T16:29:08.086
}
}
#Consumer
もらったものを処理する人。抽象メソッドはaccept。引数あり、戻り値なし。
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Consumer<String> c = System.out::println;
c.accept("test"); // -> test
}
}
#Predicate
もらったものの真偽を返す人。抽象メソッドはtest。引数あり、戻り値あり(Booleanのみ)。
import java.util.function.Predicate;
public class Main {
public static void main(String[] args) {
Predicate<String> p = ""::equals;
System.out.println(p.test("foo")); // -> false
}
}
#Function
もらったものを加工して返す、いわゆる関数。抽象メソッドはapply。引数あり、戻り値あり。
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
Function<String, Integer> f = Integer::parseInt;
System.out.println(f.apply("55") + 45); // -> 100
}
}