Kotlin中如何一次性计算集合内两个字段总和以避免两次遍历?
一次遍历计算学生总年龄与总分数
当然可以,Kotlin的fold函数就能实现单次遍历同时计算两个总和,不用跑两次sumOf。
方法一:用Pair承载累加结果
这是最简洁的方式,利用Kotlin的Pair类型和解构声明:
data class Student(val name: String, val age: Int, val score: Int) val students = listOf( Student("x", 10, 20), Student("y", 20, 40), Student("z", 30, 60) ) // 单次遍历完成两个累加 val (totalAge, totalScore) = students.fold(0 to 0) { (accAge, accScore), student -> (accAge + student.age) to (accScore + student.score) } println("总年龄:$totalAge,总分数:$totalScore") // 输出:总年龄:60,总分数:120
方法二:用自定义数据类(更直观)
如果觉得Pair的语义不够清晰,可以自定义一个数据类来存放总和:
data class Student(val name: String, val age: Int, val score: Int) data class SumResult(var totalAge: Int = 0, var totalScore: Int = 0) val students = listOf( Student("x", 10, 20), Student("y", 20, 40), Student("z", 30, 60) ) val sumResult = students.fold(SumResult()) { acc, student -> acc.apply { totalAge += student.age totalScore += student.score } } println("总年龄:${sumResult.totalAge},总分数:${sumResult.totalScore}")
两种方式都只遍历了学生集合一次,相比两次sumOf减少了一次遍历开销,在数据量较大时能体现出性能优势。
内容的提问来源于stack exchange,提问作者python dev
相关产品推荐
相关产品推荐

