menu
書いてる野郎
orebike@gmail.com
コレクション等のクラスにそれを便利に扱えるようにする別インターフェースを備えたモノ。 感覚としては Iterator と同様のモノと思えばよい。
stream を使いこなすには Java / 基礎 / ラムダ式 の理解が必須である。
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 )