lambdaについて調べてみた その1

【前提条件】

[環境]
[参考資料]

徹底解説!Project Lambdaのすべて returns[Java8Launch]@さん
徹底解説!Project Lambdaのすべて リターンズ[祝Java8Launch #jjug]

【概要】

Java8で追加されたラムダを触り始めました。
しばらくは触ってわかった事を書いていこうと思います。

ラムダはマルチコアCPUを有効に使うために
並列処理を行うための機能です。

まずはラムダの書き方についてです。
今回は並列処理は行いません。

【サンプルコード】

import java.util.function.Consumer;
import java.util.function.Function;

public class Sample {
    public static void main(final String[] args) {
        final Runnable noArgLambda = () -> { System.out.println("No Arg Lambda"); };
        final Consumer<String> argLambda = (String paramValue) -> { System.out.println(paramValue); };
        final Function<String, String> lambdaFunc = (String paramValue) -> { return "<" + paramValue + ">"; }; 

        noArgLambda.run();

        argLambda.accept("test1");
        argLambda.accept("test2");

        System.out.println(lambdaFunc.apply("test3"));
        System.out.println(lambdaFunc.apply("test4"));
    }
}

変数、noArgLambda、argLambda、lambdaFuncが
ラムダ式を使って定義したオブジェクトです。

書き方としては

(パラメータ型 パラメータ名) -> { 処理 };

です。

括弧は省略できるのですが、今回は省略せずに書いています。

【実行結果】

No Arg Lambda
test1
test2
<test3>
<test4>

【解説】

今まであったRunnableインターフェイスで新しいものではありません。
パラメータ、戻り値のなしのラムダ式を定義すると
Runnableインターフェイスのオブジェクトが作成されます。

final Runnable noArgLambda = () -> { System.out.println("No Arg Lambda"); };

↓こういうイメージです

final Runnable noArgLambda = new Runnable() {

    @Override
    public void run() {
        System.out.println("No Arg Lambda");
    }
};

パラメータ1つ、戻り値なしのラムダ式を定義すると
Consumerインターフェイスのオブジェクトが作成されます。
ConsumerでTにパラメータの型を指定します。

final Consumer<String> argLambda = (String paramValue) -> { System.out.println(paramValue); };

↓こういうイメージです

final Consumer<String> argLambda = new Consumer<String>() {

    @Override
    public void accept(String paramValue) {
        System.out.println(paramValue);
    }
};

パラメータ1つ、戻り値ありのラムダ式を定義すると
Functionインターフェイスのオブジェクトが作成されます。
FunctionでTにパラメータの型を、Rに戻り値の型を指定します。

final Function<String, String> lambdaFunc = (String paramValue) -> { return "<" + paramValue + ">"; }; 

↓こういうイメージです

final Function<String, String> lambdaFunc = new Function<String, String>() {

    @Override
    public String apply(String paramValue) {
        return "<" + paramValue + ">";
    }
};

シンタックスシュガーなのか】

ラムダ式は匿名クラスのシンタックスシュガーなのかと
思っていたのですが、参考資料のスライドを見るとどうやらそうではないようです。
(スライドでJJUGイベントのもので、私も参加したその日にエントリを書いています。)

使える変数のスコープや変数の扱いが異なるようですが、
今回のサンプルでは違いがわかりませんね・・・

いずれ調べてエントリをかけたらなぁと思います。

【まとめ】

ラムダ式を使うとRunnableなどのインターフェイス
オブジェクトが作成されました。

リストなどを扱う時に使用するStreamAPIで
使うことがメインになると思いますが、
今回はラムダでどういうオブジェクトが作成されるかについて書きました。

StreamAPIの話と同時にラムダ式の説明を見ても
私は頭がついていけなかったのですが、
Runnable、Consumer、Functionの関係を見て「なるほど」と思いました。

この3パターンを知っていると割とStreamAPIなども
入りやすいのではないかと思います。