如何使用 Grouping

如何使用 Grouping

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