【Java】関数型インタフェースのFunctionとは?

Java

関数型インタフェースにはFunctionというものがあるのをご存じでしょうか?

このインタフェースを知っているだけでコードを大変コンパクトに記載できるようになります。

今回はFunctionとBiFunctionについて例を交えて解説していきます。

Functionとは?

そもそもFunctionにはどういった機能があるのか?ですが、簡単に言うと引数を1つ受け取り、戻り値を戻すというものです。

以前ご紹介したSupplierとConsumerを合わせたようなものです。

SupplierとConsumerについて知りたい方は下記記事で解説していますので、ご参照ください。

【Java】関数型インタフェースのSupplierとは? | エンジニアKISARAGIの備忘録 (kisaragi-it.com)

【Java】関数型インタフェースのConsumerとは? | エンジニアKISARAGIの備忘録 (kisaragi-it.com)

普段プログラムを書いていたら引数・戻り値ありのメソッドを作成する機会が多いと思いますが、あれと同じ感じです。

それを事前に作成してくれているので、一から作成する必要がないというメリットがあります。

では具体的にどのように使用するかというと下記のように記載します。

【コード】
import java.util.function.Function;
public class Function1 {
	public static void main(String[] args) {
		Function<String,Integer> fun = a -> a.length();
		System.out.println("「私の趣味は読書です」の文字数は" + fun.apply("私の趣味は読書です") + "文字です");
	}
}
【実行結果】
「私の趣味は読書です」の文字数は9文字です

上記は文字数を計算するためのプログラムとなっています。

Functionに搭載されている抽象メソッドはapplyとなっています。

このapplyにFunctionに渡したい引数を入れることで、文字数を計算して戻り値として文字数が返ってきます。

Functionに記載しているダイヤモンド演算子(<>)内に記載しているのは、1つ目が引数の型で、2つ目は戻り値の方となっています。

因みに引数と戻り値の型は異なるものを記載しても大丈夫なようになっています。

Functionの合成について

ではFunctionについてある程度分かっていただけたかと思いますが、ここでは複数のFunction処理を連結させる方法について解説していきます。

「連結?」となった方も多いと思いますが、実際のコードを見ていただいた方が分かりやすいのでそれを基に解説していきます。

【コード】
import java.util.function.Function;
public class Function2 {
	public static void main(String[] args) {
		Function<String,String> japan = j -> j + " yamada ";
		Function<String,String> usa = u -> u + " kousuke ";
		System.out.println("日本ですと、「"+japan.andThen(usa).apply("私の名前は") + "です」と自己紹介します。");
		System.out.println("アメリカですと、「"+japan.compose(usa).apply("私の名前は") + "です」と自己紹介します。");
	}
}
【実行結果】
日本ですと、「私の名前は yamada  kousuke です」と自己紹介します。
アメリカですと、「私の名前は kousuke  yamada です」と自己紹介します。

上記コードでは日本の苗字→名前という自己紹介と、アメリカの名前→苗字という自己紹介を出力しています。

このコードで注目していただきたいのはandThenとcomposeという2つのメソッドについてです。

andThenは「a.andThen(b)」と使用した場合aオブジェクトを実施後にbオブジェクトを実施するというものです。

上記コードですと先にjapaneのyamadaという文字列を自己紹介文に連結して、その後usaのkousukeという文字列を連結することで「yamada kousuke」となります。

そしてcomposeはandThenの逆で「a.compose(b)」と使用した場合bオブジェクト実施後にaオブジェクトを実施するという感じです。

上記コードですと、usaのkousukeを先に文字列に連結して、japanのyamadaをその後に連結することで「kousuke yamada」となります。

BiFunctionとは?

では最後にBiFunctionについて解説しておきます。

この関数はほぼFunctionと同様の機能となっていますが、引数が2つ渡されるという点が異なります。

使用方法としては下記のようになります。

【コード】
import java.util.function.BiFunction;
public class BiFunction1 {
	public static void main(String[] args) {
		BiFunction<Integer,Integer,Integer> calculation = (a,b) -> a * b + 5;
		System.out.println(calculation.apply(12, 5));
	}
}
【実行結果】
65

上記コードは引数として12と5を渡しています。

そしてラムダ式で12*5+5という式を実施してその結果を戻り値として返しています。

上記コードではすべてInteger型にしていますが、別の引数はInteger型だが、戻り値はString型というように別の型にしても大丈夫です。

まとめ

この記事ではJavaの関数型インタフェースの一つであるFunctionについて解説してきました。

  • Functionとは?
  • Functionの合成について
  • BiFunctionとは?

引数を渡すことも可能ですし、戻り値を戻すことも可能というSupplierとConsumerを合わせたようなインタフェースとなっています。

Function、BiFunctionともにapplyというメソッドを使用することで、処理を行えます。

またandThenとcomposeというメソッドを使用することで複数のオブジェクトを連結することも可能となっています。

これらを使用することでよりコンパクトなコードを記載することが可能となりますので、ぜひマスターすることをオススメします。

以上で今回の記事は終了となります。

コメント

タイトルとURLをコピーしました