Kotlin 標準函式庫提供一組分組的標準函式,這個函式是 groupBy() 並且回傳 map,key 就是 lambda 內設定的條件。
說明
舉個例子來說。
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.groupBy { it.first() })
結果如下。
{o=[one], t=[two, three], f=[four, five]}
我們設定 lambda 條件取得第一個字元當作分類的 key,就會組成相對應的 Map。
你也可以透過 keySelector 以及 valueTransform 自己決定分類的 key 跟 value。
val numbers = listOf("one", "two", "three", "four", "five")
篩選條件如下,一樣設定第一個字元當作 key,並且本身字串最後一個字元當作 value。
println(numbers.groupBy(keySelector = String::first, valueTransform = String::last))
結果如下。
{o=[e], t=[o, e], f=[r, e]}
groupingBy
groupingBy 會回傳一個 Grouping
型別,你也可以透過 eachCount()
來判斷每一個集合有多少元素。
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.groupingBy(String::first).eachCount())
結果如下。
{o=1, t=2, f=2}
這個操作比較複雜,他可以透過一些參數來設定你要呈現的數據。
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.groupingBy { it }.aggregate { key, accumulator: StringBuilder?, element, first ->
StringBuilder().append("first:$first").append(",key:$key").append(",element:$element").append("\n")})
會有四個參數,分別為key、element、結果如下。
{one=first:true,key:one,element:one
, two=first:true,key:two,element:two
, three=first:true,key:three,element:three
, four=first:true,key:four,element:four
, five=first:true,key:five,element:five
}
參考資料
https://kotlinlang.org/docs/reference/collection-grouping.html