ラムダ式とStream API

振り返り

前回、前々回で関数型インターフェースとラムダ式について書きました。
そしてその前に書いたStreamAPIは、この2つと関係が深いので、ここでもう1回振り返ります。

StreamAPI map処理

以下はStreamAPIを使った基本的な処理。 Integer型の引数を受け取って、HelloをつけてString型を返すという使いどころ満載な処理です。

public class Studay {
    public static void main(String[] args) {
        List<Integer> data = Arrays.asList(1,2,3,4,5);//リストを宣言
        List<String> Hello = data.stream().map(i->"Hello"+i.toString()).toList();
        System.out.println(Hello);
    }
}/[Hello1, Hello2, Hello3, Hello4, Hello5]

このMAPについてドキュメントを読むと…

Stream map(Function<? super T,? extends R> mapper) このストリームの要素に指定された関数を適用した結果から構成されるストリームを返します。これは中間操作です。
型パラメータ:R - 新しいストリームの要素の型
パラメータ:mapper - 各要素に適用する非干渉でステートレスな関数
戻り値:新しいストリーム

Functionを使ってますね…。ってことで、上記のコードがこんな感じで書き換えられそうです。

public class Studay {
    public static void main(String[] args) {
        List<Integer> data = Arrays.asList(1,2,3,4,5);//リストを宣言
        List<String> Hello = data.stream().map(new Function<Integer, String>() {
            @Override
            public String apply(Integer num){
                return "Hello" + num.toString();
            }
        }).toList();
        System.out.println(Hello);
    }
}//[Hello1, Hello2, Hello3, Hello4, Hello5]

ひゃー長い。

Functionを入れてみる。

mapの中にはFunctionを代入したら良いので、事前にFunctionを宣言しててもできそうですね。

public class Studay {
    public static void main(String[] args) {
        List<Integer> data = Arrays.asList(1,2,3,4,5);//リストを宣言
        Function<Integer,String> funcHello = (i) -> "Hello" + i.toString();
        List<String> Hello = data.stream().map(funcHello).toList();
        System.out.println(Hello);
    }
}

mapはfunctionを受け取って、applyを実行して結果を返してることがわかりました。
正直、ちゃんと調べる前まで、「i-> "Hello"+i.toString()」の処理は、iで順番に引数を受け取って処理した結果を返してるぐらいの認識でした。
分解して調べることで、Functionを期待してることやラムダ式等、理解を深めることができてよかったです。めでたし。