logo header
logo header
logo header
logo header
  • 2015.11.12
  • 技術ブログ開発

java ラムダ式の使い方 その2

こんにちは。なめ橋です。
札幌は朝晩はもう息が白くなり始め、暖房費がかさむ季節になってきました。
今年は寒くなるのが早い気がします。

さて、今回も前回に引き続き、java8にて導入されたラムダ式のお話です。
予定ではStreamのことを記事にしようと思ったのですが、ラムダ式にもう少し踏み込んだ記事にしようと思います。

復習

おさらいすると、ラムダ式とは、メソッドの定義を式として記述できる言語機能です。
基本的な構文と使い方は以下の様な感じです。

基本構文
( 実装するメソッドの引数 ) -> { 処理 }
利用法

標準関数型インターフェース

それでは本題に入っていきます。
前述した通り、ラムダ式はメソッドの定義を式としてあらわすものです。
つまり、ラムダ式自体(メソッド定義自体)を変数に格納することが可能です。
そのように利用をするための仕組みとして、標準関数型インターフェースというものが存在します。
標準関数型インターフェースはジェネリックを利用して、引数となる型または返り値の型を定義します。
以下にベースとなる標準関数型インターフェースを列挙します。

インターフェース 抽象メソッド 解説
Function R apply(T t) T型を引数に取り、R型オブジェクトを返す。
Predicate boolean test(T t) T型を引数に取り、booleanを返す。
Consumer R apply(T t) T型を引数に取り、返り値はなし。
Supplier R apply(T t) 引数なしで、T型オブジェクトを返す。

では実際の使用例を見てみましょう。

まず1行目で、Function型の宣言及び実行する内容を記載しています。
今回は引数にとったInteger型の仮引数を、String型に変換して返すというものです。
イメージとしては、1行目の右辺が4行目のapplyメソッドの内容を定義しているといった感じです。
試しに上記表をひととおり定義・実行してみましょう。

標準関数型インターフェースは他にも様々なインターフェースがありますが、基本としては上記が理解できていればよいと思われます。

関数型インターフェースの作成

標準関数型インターフェースを合成することで、新しい関数型インターフェースを作成することが可能です。
標準関数型インターフェースは基本的に3つ以上の引数を持つことはありませんが、この方法を使えば3つ以上の引数を持つ関数型インターフェースを定義することも可能です。
※ただし、可読性が下がるためあまりお勧めはできないです。
試しに、Integer型の引数を2つ取り、String型を返す関数型インターフェースを定義してみます。

ラムダ式のところで少々混乱しそうですが、「Parameter1 -> Parameter2」はメソッド形式にすると「hoge(Integer Parameter1 ,Integer Parameter2)」ということになります。
※実際の内部処理は違うのであくまでイメージとしてです。

上記の実行結果は以下になります。

また、定義した標準関数型インターフェースを合成することも可能です。
合成には「compose」または「addthen」メソッドを使用します。

上記は、「引数に取った文字列の長さを返す」関数型インターフェースと「引数をString型に変換する」関数型インターフェースを合成したものになります。
また、「andthen」メソッドで合成した場合、引数に取った関数型インターフェースが後に呼ばれます。
そのため、mixFunctionが取るべき引数の型はfunction2の引数の型(String型)となります。

いかがでしたか?
標準関数型インターフェースを用いることで自由にメソッドを定義し、変数に入れて実行することが可能となります。
ただ、多用しすぎると可読性が下がり、あとで見返した時に処理を追えなくなることがままありますので注意してください。

ともに世界をアップグレードできる、そんな日を夢見て。
Upgrade the World!