こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

Stream APIのmapメソッドを使う

こんにちは。「Javaを復習する初心者」です。今回はStream APIのmapメソッドを使ってみました。

Stream APIの中間操作にmapメソッドが用意されています。今回はmapメソッドを使って、配列から新しい配列を生成することを試しました。

各要素を2倍にする操作

以下はint型配列{1, 2, 3}の各要素を2倍にする操作をして、新しい配列を生成するプログラムです。中間操作のmapメソッドを使っています。ラムダ式が使えます。最後に呼び出しているtoArray()メソッドは終端操作で、ストリームの要素を含む配列を返します。

        int[] nums = {1, 2, 3};
        int[] newNums = Arrays.stream(nums).map(num -> 2 * num).toArray();
        System.out.println(Arrays.toString(nums));
        System.out.println(Arrays.toString(newNums));
[1, 2, 3]
[2, 4, 6]

上記の結果からわかるように、元の配列には影響はありません。2行目の出力を見ると、各要素が2倍になっていることが分かります。

置き換える操作

クラス型の配列も試してみました。String型配列{ “abc”, “abcd”, “abcde” }に対して、「bc」を「z」に置き換える操作をしてみました。String#replaceメソッドを中間操作で使用しました。以下がソースと出力結果です。

        String[] strs = { "abc", "abcd", "abcde" };
        String[] newStrs = Arrays.stream(strs).map(str -> str.replace("bc", "z")).toArray(String[]::new);
        System.out.println(Arrays.toString(strs));
        System.out.println(Arrays.toString(newStrs));
[abc, abcd, abcde]
[az, azd, azde]

2行目を見ると、置き換え処理ができていることが確認できます。

最後に呼び出しているtoArrayはStream<T>インターフェースに定義されているメソッドです。引数の書き方はAPI仕様書を参考にしました。toArrayの定義は「<A> A[] toArray(IntFunction<A[]> generator)」です。API仕様書によれば、このメソッドの引数はgenerator関数というそうです。そして、配列コンストラクタ参照という方式で表現できると記載されています。

ネットで調べた結果、コンストラクタ参照とは「クラス名::new」という記述のようです。

Listの場合

Listでも同様の操作ができます。以下、ソースと実行結果です。

        List<Integer> nums = new ArrayList<>();
        nums.add(10);
        nums.add(11);
        nums.add(13);
        List<Integer> newNums = nums.stream().map(num -> 2 * num).collect(Collectors.toList());
        System.out.println(nums);
        System.out.println(newNums);

        List<String> strs = new ArrayList<>();
        strs.add("ABC");
        strs.add("ABCD");
        strs.add("ABCDE");
        List<String> newStrs = strs.stream().map(str -> str.replace("BC", "Z")).collect(Collectors.toList());
        System.out.println(strs);
        System.out.println(newStrs);
[10, 11, 13]
[20, 22, 26]
[ABC, ABCD, ABCDE]
[AZ, AZD, AZDE]

Listの場合は、最後に呼び出すメソッドは「collect(Collectors.toList())」のようです。