LoginSignup
2
1

導入

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つ取り、結果を返す関数です。
TUは引数の型、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プログラミングを実現します。これらのインターフェースと使い方に慣れることで、日常的なコードの簡素化や保守性の向上に役立つでしょう。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1