在 Kotlin 中,groupBy
是一个非常有用的集合操作函数。我们可以使用它按照某个标准,将集合中的元素分组,形成一个 Map,其中 key 是我们分组的标准,value 是符合这个标准的元素列表。本文将通过几个实际例子,来详细说明如何使用 groupBy
,并且还会解释一些常见的应用场景。
什么是 groupBy
?
groupBy
是 Kotlin 标准库中的一个扩展函数,适用于集合、列表、数组等。它接收一个 lambda 表达式,根据这个 lambda 表达式的返回值对集合中的元素进行分组。
语法
kotlin
fun <T, K> Iterable<T>.groupBy(
keySelector: (T) -> K
): Map<K, List<T>>
T
表示集合中的元素类型K
表示分组的标准,也就是我们通过keySelector
函数返回的值- 返回值是一个
Map<K, List<T>>
,其中K
是分组标准,List<T>
是符合该标准的元素列表
😄 简单来说,groupBy
就是将集合中的元素按照我们提供的标准进行分组。
基本用法
假设我们有一个员工列表,其中包含每个员工的姓名和年龄。我们想要按照员工的年龄来分组,那么可以这样使用 groupBy
:
kotlin
data class Employee(val name: String, val age: Int)
fun main() {
val employees = listOf(
Employee("John", 25),
Employee("Sarah", 30),
Employee("Mike", 25),
Employee("Emma", 30),
Employee("Chris", 22)
)
val groupedByAge = employees.groupBy { it.age }
println(groupedByAge)
}
输出结果
bash
{25=[Employee(name=John, age=25), Employee(name=Mike, age=25)],
30=[Employee(name=Sarah, age=30), Employee(name=Emma, age=30)],
22=[Employee(name=Chris, age=22)]}
在这个例子中,我们根据员工的 age
属性进行分组,得到的结果是一个 Map,每个年龄对应一个员工列表。
自定义分组标准
如果我们想根据员工的名字长度来分组,可以通过 groupBy
函数轻松实现:
kotlin
val groupedByNameLength = employees.groupBy { it.name.length }
println(groupedByNameLength)
输出结果
bash
{4=[Employee(name=John, age=25), Employee(name=Mike, age=25)],
5=[Employee(name=Sarah, age=30), Employee(name=Chris, age=22)],
4=[Employee(name=Emma, age=30)]}
通过这个例子,我们将员工按名字长度进行了分组。
常见应用场景
1. 按条件统计
比如我们有一个产品列表,想按照产品的类型分组统计每种类型的产品数量:
kotlin
data class Product(val name: String, val type: String)
val products = listOf(
Product("Laptop", "Electronics"),
Product("Phone", "Electronics"),
Product("Sofa", "Furniture"),
Product("Table", "Furniture"),
Product("Headphones", "Electronics")
)
val groupedByType = products.groupBy { it.type }
val countByType = groupedByType.mapValues { it.value.size }
println(countByType)
输出结果
bash
{Electronics=3, Furniture=2}
通过这个方式,我们可以轻松统计出每种类型的产品数量。
2. 按属性分类
在某些场景下,我们需要将数据按属性分组,比如按照学生的成绩等级分组:
kotlin
data class Student(val name: String, val score: Int)
val students = listOf(
Student("Alice", 85),
Student("Bob", 70),
Student("Charlie", 90),
Student("David", 60)
)
val groupedByGrade = students.groupBy {
when {
it.score >= 85 -> "A"
it.score >= 70 -> "B"
else -> "C"
}
}
println(groupedByGrade)
输出结果
bash
{A=[Student(name=Alice, score=85), Student(name=Charlie, score=90)],
B=[Student(name=Bob, score=70)],
C=[Student(name=David, score=60)]}
通过 when
表达式,我们可以根据学生的分数将他们分为 A、B、C 三个等级。
结论
Kotlin 中的 groupBy
是一个功能强大的工具,可以让我们轻松地按照不同标准对集合中的元素进行分组。无论是按属性分组还是按自定义规则分组,groupBy
都能够提供灵活的解决方案。在实际开发中,它能够帮助我们更高效地处理和组织数据,让代码更加简洁易读。
Best Regards!!