導入
Java SE 8から、関数型インターフェースが導入され、Javaでの関数型プログラミングがより簡単になりました。関数型インターフェースは、1つの抽象メソッドを持つインターフェースです。
「1つの抽象メソッドを持つインターフェース」 というワードですぐにラムダ式
が思いついた人はさすがです。
この関数型インターフェースは、ラムダ式を利用したものになります。
本記事では、特によく使われる関数型インターフェースについて説明し、その利用方法を紹介します。
使用頻度の高い関数型インターフェース
Function<T, R>
Function<T, R>
は、引数を1つ取り、結果を返す関数です。
T
は引数の型、R
は戻り値の型です。
抽象メソッドはR apply(T)
になります。
使用例
Function<Integer, String> ageFunction = (age) -> { return age + "歳"; };
String ageString = ageFunction.apply(30);
System.out.println(ageString);
// [30歳]
上記のようにapplyメソッドを使用することで、R
で指定した型、今回ならString型の戻り値を取得することができます。
BiFunction<T, U, R>
こちらはFunctionに似ていますが、少し異なります。
BiFunction<T, U, R>
は、引数を2つ取り、結果を返す関数です。
T
とU
は引数の型、R
は戻り値の型です。
BiFunction<Integer, Integer, String> taxFunction = (price, taxRatio) -> { return (price * (0.01 * tax + 1)) + "円"; };
String taxIncludedPrice = taxFunction.apply(10000, 10);
System.out.println(taxIncludedPrice);
// [10100円]
使い方としてはFunctionと同様ですが、引数を2つ取れるので、計算等に向いています。
Consumer<T>
Consumer<T>
は、引数を1つ取ります。
戻り値はvoidです。
抽象メソッドはvoid accept(T)
です。
使用例
Consumer<String> getConsumer = (item) -> { System.out.println(item + "を手に入れた!"); };
getConsumer.accept("伝説の剣");
// [伝説の剣を手に入れた!]
Predicate<T>
Predicate<T>
は、引数を1つ取り、booleanを返します。
抽象メソッドはboolean test(T)
です。
使用例
Predicate<Integer> positiveNum = (inputNum) -> { return inputNum > 0; };
boolean input1 = positiveNum.test(-10);
System.out.println(input1);
// false
boolean input2 = positiveNum.test(100);
System.out.println(input2);
// true
こちらは最近のドメイン駆動設計において、人気が高まっています。
これまでのAND/OR/NOT条件をPredicate型を利用することで、よりシンプルで明確なコードにすることができるためです。
Predicate<Integer> positiveNum = (inputNum) -> { return inputNum > 0; };
Predicate<Integer> lessThan10 = (inputNum) -> { return inputNum < 0; };
// 複合条件を作成
Predicate<Integer> posiAndLess10 = positiveNum.and(lessThan10);
boolean input3 = posiAndLess10.test(-10);
System.out.println(input3);
// false
boolean input4 = posiAndLess10.test(100);
System.out.println(input4);
// false
boolean input5 = posiAndLess10.test(5);
System.out.println(input5);
// true
Supplier<T>
Supplier<T>
は、引数を取りませんが、結果を返す関数です。
抽象メソッドはT get()
です。
使用例
Supplier<String> helloSupplier = () -> "Hello World!";
String helloMessage = helloSupplier.get();
System.out.println(helloMessage);
// Hello World!
メソッド参照
メソッド参照は、ラムダ式の代わりに使用できる、関数型インターフェースを実装する手段の1つです。例えば、System.out.println()
をSystem.out::println
と表現できます。
使用例
Consumer<String> println = System.out::println;
println.accept("Hello World!");
// 参考:ラムダ式
Consumer<String> println2 = (str) -> { System.out.println(str); };
println2.accept("Hello World!");
最後に
Java SE 8で導入された関数型インターフェースは、ラムダ式やメソッド参照を使った簡潔なコード記述を可能にし、より直感的でモダンなJavaプログラミングを実現します。これらのインターフェースと使い方に慣れることで、日常的なコードの簡素化や保守性の向上に役立つでしょう。