Java8のラムダ式について簡単に説明します

こんにちは!ぐちです。

皆様GWはいかがお過ごしでしたか?僕は特にどこに行くでもなくプログラミングのお勉強してました。(ドヤ顔)笑

今更感は否めないですが、Java8から導入されたラムダ式について学習したことをメモを兼ねてご紹介したいと思います。

ラムダ式とは

匿名クラスのことです。以上です。笑

冗談はさておき、もう少し詳しく書きますね!

基本構文

( 引数 ) -> { 処理 }

これだけ見たってわからないですよね。。。どういうことかと言いますと、ラムダ式は関数インターフェース(実装が必要なメソッドを1つだけ持つインターフェース)で使うことができる式なのです。
コードで見てましょう!

関数型インターフェースのひとつにConsumerというクラスがあるんですが、これは実装が必要なメソッドがaccept()なので以下のように記述します。

Consumer<String> cons = new Consumer<String>() {
    @Override
    public void accept(String str) {
        System.out.println(str);
    }
};

このように実装すべきメソッドが1つだけの場合はラムダ式がどのメソッドを記述しているのか決まるので下記のように記述することができます。

Consumer<String> cons = (str) -> {System.out.println(str);};

実装すべきメソッドが複数ある場合はラムダ式で記述することができません。コンパイルエラーになりますのでご注意ください。

構文

上記でご紹介した(引数0 -> {処理}の基本構文以外に、複数の構文があります。

引数部分

() -> {処理} // 引数なし場合
(str) -> {処理} // 引数が1つだけの場合
str -> {処理} // 引数が1つだけの場合は括弧を省略可
(str, n) -> {処理} // 引数が2つの場合
(String str, int n) -> {処理} // データ型は推論されるので不要ですが記述も可能

処理部分

(引数) -> System.out.println(str) // 処理が一つの場合、returnもブロック括弧も省略可
(引数) -> {
    System.out.println(str); // ブロック括弧を使って複数の処理文を記述可
    return n;                        // 戻り値が必要な場合はreturnを記述
}

使い方

では、続きまして、実際の使い方をご紹介します。

Iterableインタフェースに追加されたforEachメソッドでチェックしてみましょう。forEachメソッドの引数にはConsumer<?super T>actionを渡します。

文字列リストを順番に表示するプログラムをラムダ式を使わずに記述すると下記のようになります。

List<String> list = Arrays.asList("a", "b", "c");
list.forEach(new Consumer<String>() {
    @Override
    public void accept(String str) {
        System.out.println(str);
    }
});

これをラムダ式を使って記述すると次のようになります。

List<String> list = Arrays.asList("a", "b", "c");
list.forEach(str -> System.out.println(str));

変数のスコープ

変数のスコープなどラムダ式特有の制限がありますが、それらはまた後日。笑

Java9のリリースも囁かれている中での今更ネタでしたが、少しずつマスターしていければなと思っています。

では今回はこの辺で。