はじめに
最近お仕事の都合で、Java を使う機会に恵まれたので
太古のJava( 1.3 )知識をアップデートしてみました。
ラムダ式 とは
関数的インターフェイスを簡単に実装するための機能です。
これだけでは何のことかさっぱりなので、例を出しつつ説明したいと思います。
ラムダ式の違いをコードで比較
ラムダ式を使わないコード
public static void main(String[] args) {
class Sample implements Runnable {
public void run() {
System.out.println("I Love Pengin!");
}
}
Runnable runner = new Sample();
times( 10, runner );
}
public static void times( int count, Runnable runner ) {
for( int i = 0; i < count; i++ ) {
runner.run();
}
}
ラムダ式を使ったコード
public static void main(String[] args) {
funcCall( 10, () -> System.out.println("I Love Pengin!") );
}
public static void times( int count, Runnable runner ) {
for( int i = 0; i < count; i++ ) {
runner.run();
}
}
使うと何が良いの?
指定の処理を複数回繰り返す times
関数への処理を例にしました。
見比べてみると、ラムダ式を使うと随分と完結に処理がかけていることが見比べていただけると思います。
処理の一部を他のオブジェクトに代替させる手法を委譲と呼ぶのですが、
ラムダ式を使うことで、この委譲が随分と書きやすくなることがメリットに上がると思います。
ラムダ式の書き方
書式
ラムダ式を使う場合の書式を見ていきましょう
() -> System.out.println("I Love Pengin!")
- 最初の
()
はメソッドの引数を表します。今回は引数を使用してませんが引数を使用することも可能です。 -
->
が実際の処理内容を記載しています。 処理内容が複数にまたがる場合は、-> { ここに処理 }
と記載します。
※引数や、戻り値を利用する場合、呼び出される側( 今回ならtimes関数 )の実装が少し異なります。
引数を使用したラムダ式
使うとき
ラムダ式の引数を指定することで、処理中に引数が利用できます。
java
(i) -> System.out.println("I Love Pengin!" + i)
作るとき
利用する引数、戻り値の種類に応じて、関数インターフェイスを使い分ける必要があります。
引数1つ、戻り値なしの場合は、以下のようになります。
public static void times( int count, Consumer<Integer> runner ) {
for( int i = 0; i < count; i++ ) {
runner.accept(new Integer(i));
}
}
使い分けるインターフェイスは以下の様になります。
種類 | 関数インターフェイス | メソッド |
---|---|---|
値を返さない 引数0個 | Runnable | run |
値を返さない 引数1個 | Consumer | accept |
値を返さない 引数2個 | BiConsumer | accept |
値を返す 引数0個 | Supplier | get |
値を返す 引数1個 | Function | apply |
値を返す 引数2個 | BiFunction | apply |
真偽値を返す 引数1個 | Predicate | test |
真偽値を返す 引数2個 | BiPredicate | test |
演算結果を返す 引数1個 | UnaryOperator | test |
演算結果を返す 引数2個 | BinaryOperator | test |