こんにちは。「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())」のようです。