分組
Kotlin 標準函式庫提供了用於分組集合元素的擴充函式。 基本函式 groupBy() 接受一個 Lambda 函式並返回一個 Map。在此映射中,每個鍵都是 Lambda 的結果,而對應的值則是產生此結果的元素 List。例如,此函式可用於依照字串 List 的第一個字母進行分組。
您也可以呼叫 groupBy() 並帶入第二個 Lambda 引數——一個值轉換函式。 在使用兩個 Lambda 的 groupBy() 結果映射中,keySelector 函式所產生的鍵會被映射到值轉換函式的結果,而不是原始元素。
此範例說明了如何使用 groupBy() 函式依據字串的第一個字母進行分組,使用 for 運算子迭代結果 Map 上的分組,然後使用 valueTransform 函式將值轉換為大寫:
kotlin
fun main() {
val numbers = listOf("one", "two", "three", "four", "five")
// Groups the strings by their first letter using groupBy()
val groupedByFirstLetter = numbers.groupBy { it.first().uppercase() }
println(groupedByFirstLetter)
// {O=[one], T=[two, three], F=[four, five]}
// Iterates through each group and prints the key and its associated values
for ((key, value) in groupedByFirstLetter) {
println("Key: $key, Values: $value")
}
// Key: O, Values: [one]
// Key: T, Values: [two, three]
// Key: F, Values: [four, five]
// Groups the strings by their first letter and transforms the values to uppercase
val groupedAndTransformed = numbers.groupBy(keySelector = { it.first() }, valueTransform = { it.uppercase() })
println(groupedAndTransformed)
// {o=[ONE], t=[TWO, THREE], f=[FOUR, FIVE]}
}如果您想分組元素並一次性對所有分組套用操作,請使用 groupingBy() 函式。 它會返回一個 Grouping 類型的實例。Grouping 實例讓您能以惰性方式對所有分組套用操作:分組實際上是在操作執行之前才建立的。
具體來說,Grouping 支援以下操作:
eachCount()計算每個分組中的元素數量。fold()和reduce()對每個分組作為獨立集合執行 摺疊與歸約 操作並返回結果。aggregate()依序對每個分組中的所有元素套用指定操作並返回結果。 這是對Grouping執行任何操作的通用方式。當摺疊或歸約不足以滿足需求時,使用它來實作自訂操作。
您可以使用 for 運算子在結果 Map 上迭代由 groupingBy() 函式建立的分組。這讓您可以存取每個鍵以及與該鍵關聯的元素數量。
以下範例示範如何使用 groupingBy() 函式依據字串的第一個字母進行分組,計算每個分組中的元素數量,然後迭代每個分組以印出鍵和元素數量:
kotlin
fun main() {
val numbers = listOf("one", "two", "three", "four", "five")
// Groups the strings by their first letter using groupingBy() and counts the elements in each group
val grouped = numbers.groupingBy { it.first() }.eachCount()
// Iterates through each group and prints the key and its associated values
for ((key, count) in grouped) {
println("Key: $key, Count: $count")
// Key: o, Count: 1
// Key: t, Count: 2
// Key: f, Count: 2
}
}