知识点
通过本篇文章,你可以学到
- groupBy 扩展函数的使用
缘起
还是和之前类似的接口定义和实体类:
之前的文章 斯国一 flatMap 原来是这样用的
Person 接口
interface Person {
val type: Int
val id: Int
val name: String
}
Student 数据类
class Student(override val type: Int, override val id: Int, override val name: String) : Person
Teacher 数据类
class Teacher(override val type: Int, override val id: Int, override val name: String) : Person
我们可以看到,Teacher
类和 Student
类都同时实现了 Person
接口,同时它们之间也有一个共同的属性 type,我们可以通过 type 属性区分它们是 Teacher
类还是 Student
类(假定 type 值为 0 的是 Teacher
,type 值为 1 的是 Student
)。
假设,我们已经有了一组包含老师和学生的数据 List<Person>
,现在我们想要分别得到其中的 teacherList (即:type 值为 0 的 List<Person>
)和 studentList (即:type 值为 1 的 List<Person>
)。
数据源
这次因为是 List<Person>
的数据,所以就不再用 json 数据表示了。
val personList: List<Person> = listOf(
Teacher(0, 1234, "张老师"),
Student(1, 2234, "王麻子"),
Student(1, 2235, "狗蛋"),
Teacher(0, 1235, "李老师"),
Student(1, 2236, "赵雪梅"),
Student(1, 2237, "马冬梅"),
Teacher(0, 1236, "王老师"),
Student(1, 2237, "李华"),
Student(1, 2238, "胖虎")
)
代码实现
初学过 Java 的同学肯定会毫不犹豫的写出这样的代码
// 方案1
val teacherList = mutableListOf<Person>()
val studentList = mutableListOf<Person>()
personList.forEach {
if (it.type == 0) {
teacherList.add(it)
}
}
personList.forEach {
if (it.type == 1) {
studentList.add(it)
}
}
聪明的同学可能会想了,上面代码循环了两次,性能会比较差,于是会写出下面的代码
// 方案2
val teacherList1 = mutableListOf<Person>()
val studentList1 = mutableListOf<Person>()
personList.forEach {
if (it.type == 0) {
teacherList.add(it)
} else if (it.type == 1) {
studentList.add(it)
}
}
稍微熟悉一点 kotlin 的同学,可能会写出下面的代码(显而易见,也还是需要循环两次 personList 才能得到最终的结果,性能和方案 1 其实差不多,只不过代码看着会比较简洁)
// 方案3
val teacherList2: List<Person> = personList.filter { it.type == 0 }
val studentList2: List<Person> = personList.filter { it.type == 1 }
然鹅,更加熟悉一点 kotlin 的同学,可能会写出下面的代码
// 方案4
val group: Map<Int, List<Person>> = personList.groupBy { it.type }
val teacherList3 = group[0]
val studentList3 = group[1]
综合比较
前段时间 ChatGPT 还是比较火热的,那么我们把这几种方案丢给 ChatGPT 给我们分析分析,看看比较的结果是怎么样的。
如果对你有帮助的话,欢迎一键三连+关注哦~
本文由
A lonely cat
原创发布于
阳光沙滩
,未经作者授权,禁止转载