Kotlin GroupByまとめ
Kotlinコレクションを操作してをGroupByしてまとめたい。ということでコード補完を・・・・・
って似たようなメソッドが5つもあるやないかい!!!
ということでこれらを全部調べてみました。
##1. groupBy(keySelector: (T) -> K): kotlin.collections.Map<K, kotlin.collections.List<T>>
どうやら要素からキーを生成してまとめるらしい。returnはMapでkeyが生成したキーでValueが要素と・・・・
はい。求めていたものはこれです。これで明日も安泰です。これで今夜もぐっすり眠れます。ということでサンプルコードを載せておきます。
// お友達の名簿をGroupBy
val friends: Map<Int, List<Friend>> = listOf(
Friend("takashi", 19),
Friend("satoshi", 20),
Friend("takao", 21),
Friend("sadap", 20),
Friend("hideki", 20),
Friend("rikio", 21),
).groupBy { it.age }
println("型:${friends.javaClass.kotlin}")
println("-------------------------------")
println("結果:${friends}")
型:class java.util.LinkedHashMap
-------------------------------
結果:{19=[Friend(name=takashi, age=19)], 20=[Friend(name=satoshi, age=20), Friend(name=sadap, age=20), Friend(name=hideki, age=20)], 21=[Friend(name=takao, age=21), Friend(name=rikio, age=21)]}
##2.groupBy(keySelector: (T) -> K, valueTransform: (T) -> V): kotlin.collections.Map<K, kotlin.collections.List<V>>
こちらは第一引数に要素からキーを生成する処理を渡し、第二引数にはValueを変化させる処理を渡せるようですね。
// お友達の名簿をGroupBy
val friends: Map<Int, List<String>> = listOf(
Friend("takashi", 19),
Friend("satoshi", 20),
Friend("takao", 21),
Friend("sadap", 20),
Friend("hideki", 20),
Friend("rikio", 21),
).groupBy(
{ it.age },
{ "Mr." + it.name } // ValueをFriend型からString型に変化
)
println("型:${friends.javaClass.kotlin}")
println("-------------------------------")
println("結果:${friends}")
型:class java.util.LinkedHashMap
-------------------------------
結果:{19=[Mr.takashi], 20=[Mr.satoshi, Mr.sadao, Mr.hideki], 21=[Mr.takao, Mr.rikio]}
疲れたのでまた今度追記します。見てくれてありがとうございました。