Java / Ope / Collection操作 / Stream

Java / Ope / Collection操作 / Stream

List からその stream を得る

Java8 からその stream を得るメソッド steam が実装されているのでそれを使う

List<String> aList = new ArrayList<>();
aList.add("aaaa");
aList.add("bbbb");
aList.add("cccc");
aList.add("dddd");
// これで得る
Stream<String> s = aList.stream();

Stream というのは処理が終了してしまうともう2度と使えないので、このように変数に格納しておく必要性はほぼ無い。 これは得る例としてのコードで実用性はゼロ。

全ての要素のあるメンバを集める

よくシステムの境界面で使うような、あるインスタンスの ID だけ全部欲しいみたいなやつである。

要素に処理してその結果を再度コレクションにするには map メソッドを使う。 Ruby とかにあるアレである。

List<Hoge> hogeList = new ArrayList<>();
hogeList.add(new Hoge("aaa"));
hogeList.add(new Hoge("bbbb"));
hogeList.add(new Hoge("cccc"));
hogeList.add(new Hoge("dddd"));
List<String> idList = hogeList.stream().map(v -> v.getId).collect(Collectors.toList());
for(String id : idList) {
    System.out.println(id);
}

これの出力はこうなる。

aaaa
bbbb
cccc
dddd

全ての要素に処理を加える

各要素に処理を加えてその結果を再度コレクションにするには同じく map メソッドを使う。

List<String> aList = new ArrayList<>();
aList.add("aaaa");
aList.add("bbbb");
aList.add("cccc");
aList.add("dddd");
aList = aList.stream().map(v -> v + "123").collect(Collectors.toList());
for(String a : aList) {
    System.out.println(a);
}

これの出力はこうなる。

aaaa1234
bbbb1234
cccc1234
dddd1234

map にラムダを渡しているて各要素に対して「123」を連結している。 map の戻りは stream になっているので、これに対してさらに処理を連結して書くことができる。

今回は処理はこれで終わりで、また List に戻したいので collect メソッドを使っている。 処理は非破壊的に行われるので、元の List は影響をうけない。

要素を選択する

これもよくあるやつで、true な要素だけを選択的に集めることができる。

この例では「b」から始まる要素だけ集められた。

List<String> aList = new ArrayList<>();
aList.add("aaaa");
aList.add("bbbb");
aList.add("cccc");
aList.add("dddd");
aList = aList.stream().filter(a -> a.indexOf("b") == 0).collect(Collectors.toList());
for(String a : aList) {
    System.out.println(a);
}

ソートする

ソートをするには sorted というメソッドを使うこいつに引数を渡すことで様々にソートする。

単純に現状の逆順ソートなら、このようになる。

List<String> aList = new ArrayList<>();
aList.add("aaaa");
aList.add("bbbb");
aList.add("cccc");
aList.add("dddd");
aList = aList.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
for(String a : aList) {
    System.out.println(a);
}

sorted に Comparator インスタンスを何か渡せばよいということになる。

このへんのマニュアルを読むとよい。 Comparator (Java Platform SE 8 )

java/ope/collection_ope/stream/start.txt · 最終更新: 2021-02-01 19:43 by ore