Javaのstreamですが知れば知るほどいろいろな機能がありますね。
基本的にプログラムって配列(コレクション含む)とオブジェクトの処理が中心になるので、配列の処理をいかにうまくできるかは非常に大事です。
Javaは当初、配列関連のライブラリが貧弱やなーとかおもっていたんですが、streamを調べてみるとすごくいろいろなことができてビックリ。
例えば下記のようなデータを区切り文字で一気につなげることができます。
1 2 3 |
tokyo => [{pref=tokyo, name=jirou, age=18}, {pref=tokyo, name=gorou, age=9}] chiba => [{pref=chiba, name=ichirou, age=30}, {pref=chiba, name=saburou, age=25}] kanagawa => [{pref=kanagawa, name=shirou, age=45}] |
これを下記のように変換したいとします。
1 2 3 |
tokyo =>[jirou,grou] chiba =>[ichirou,saburou] kanagawa=>[shirou] |
上記のようなマップがあったとして下記のような変換で変えることができます。
Mapのなかに入っているオブジェクトはname,age,prefのみとし、このオブジェクトをPersonとします。
Map<String,List<Person>>[personPrefListMap]を Map<String,String>[personPrefList]にしたいとします。
1 2 3 4 |
personPrefListMap.forEach((pref, list) -> { String splitedPersonList = list.stream().map(person::getName).collect(Collectors.joining(",")); personPrefList.put(pref, splitedPersonList); }); |
この処理がこれだけの行数でかけてしまうのが驚きです。
本来は1行でかけるのでしょうが見やすさと自分のスキルを考えて今は上のように書いておきました。
ともかく便利すぎです・・・
ちなみに下記にはもっと詳しい解説があります
[…] MapのStream http://skill-up-engineering.com/?p=642 […]