こんにちは、Sawa です!

前回のブログでは java.util.function パッケージの関数型インタフェースの使い方について学びました。 まだ読んでいない方はこちらから読んでみてください。
【Java】関数型インタフェースを使ってみよう(Stream 理解への道2)

今回はラムダ式について詳しく学んでいこうと思います。 前回までのコードでもラムダ式はちょくちょく出てきていましたが、あえて冗長な書き方をしていました。 ラムダ式を理解すればもっと簡潔にコードが書けますのでさっそく学んでいきましょう!

ラムダ式って?

前回のブログでこのようなコードを書きました。

import java.util.function.Function;

public class Main {

    public static void main(String[] args){
        Function<Integer,String> func = (Integer num) -> {return num.toString();};

        System.out.println(func.apply(4)); // 4 を表示
    }
}

ラムダ式は下のような式のことです。

(Integer num) -> {return num.toString();};

ラムダ式の省略記法を学ぶことでより簡潔にコードが書けるようになります。 では、省略記法を見てみましょう。

ラムダ式の省略記法

  • 引数宣言における型を省略可能
  • 引数が1つの場合かつ型の表記が省略されている場合、引数宣言の () の省略が可能
  • ラムダ式が単一の return 文の場合、{} と return 文を省略可能

上記がラムダ式の省略記法になります。 一つ一つ具体例を交えて紹介していきます。

引数宣言における型を省略可能

この省略記法による変化を以下に示します。

(Integer num) -> {return num.toString();};

 (num) -> {return num.toString();};

こんな感じで型を省略することができます。 なぜ型の省略が可能かといいますと、Function<T,R> で引数と戻り値を指定するときに num の型は必然的に Integer になることがわかっているからです。

// 左辺ですでに引数が Integer 型と決まっている
Function<Integer,String> func = (num) -> {return num.toString();};

引数が1つの場合かつ型の表記が省略されている場合、引数宣言の () の省略が可能

これも書いてある通りです。 変化を見てみましょう。

 (num) -> {return num.toString();};

num -> {return num.toString();};

だいぶスッキリしてきましたね。 前回のブログでは触れませんでしたが、Function<T, R> の引数を2つにした BiFunction<T,U,R> という関数型インタフェース(引数2つで戻り値あり)もあります。 こちらも使って引数宣言を省略記法で記述してみます。

BIFunction を使ったコード

public class Main {

    public static void main(String[] args){
        BiFunction<Integer,String,Integer> func = (Integer num, String strNum) -> { return num + Integer.valueOf(strNum);};

        System.out.println(func.apply(3, "4")); // 7 を表示
    }
}

Integer 型で宣言した数字と String 型で宣言した数字を足すシンプルなコードです。 これは引数が複数あるので、() を省略しようとするとコンパイルエラーになります。

import java.util.function.BiFunction;

public class Main {

    public static void main(String[] args){
        // 引数の宣言の箇所でコンパイルエラー
        BiFunction<Integer,String,Integer> func = num,strNum -> { return num + Integer.valueOf(strNum);};

        System.out.println(func.apply(3, "4")); // 7 を表示
    }
}

また、型の表記が省略されていない場合もコンパイルエラーになるので注意しましょう。

 // コンパイルエラー
Function<Integer,String> func = Integer num -> {return num.toString();};

ラムダ式が単一の return 文の場合、{} と return 文を省略可能

単一の return 文というのは {} 内が return 文のみということです。 では、省略の変化を見ていきましょう。

num -> {return num.toString();};

num -> num.toString();

この省略記法もだいぶスッキリさせることが可能です。

しかし、{} 内が return 文だけでなく、複数行記述されている場合はこの省略記法はできません。

※ 下記は {} と return 文が省略不可

public class Main {

    public static void main(String[] args){
        Function<Integer,String> func = num -> {
            num ++;
            return num.toString();
        };

        System.out.println(func.apply(4)); // 4 を表示
    }
}

ラムダ式を省略記法で記述してみる

では、最後に今日学んだ省略記法を使って Functioon インタフェースの apply() メソッドを実装してみましょう。 前回のブログで書いた Function のコードです。

import java.util.function.Function;

public class Main {

    public static void main(String[] args){
        Function<Integer,String> func = (Integer num) -> {return num.toString();};

        System.out.println(func.apply(4)); // 4 を表示
    }
}

↓ 省略記法を使うと、、

import java.util.function.Function;

public class Main {

    public static void main(String[] args){
        Function<Integer,String> func = num -> num.toString();

        System.out.println(func.apply(4)); // 4 を表示
    }
}

簡潔に記述できていることが一目でわかりますね!

Stream では ラムダ式の省略記法を使って簡潔にリストの中身を操作したりすることが可能です。 次回のブログではついに Stream API について学んでいこうと思います。
【Java】Stream を理解しよう(Stream 理解への道4)

投稿者 Sawa