Kotlin如何对对象列表内各元素的Mutable Map值求和并转换格式
实现方案
首先修正你示例代码里的Map初始化写法,Kotlin中没有{key=value}格式的Map字面量,需要用mutableMapOf()配合to关键字定义键值对,原始列表正确初始化如下:
var myList = listOf( Activity("A", prize = mutableMapOf("day_5" to 70, "day_4" to 70)), Activity("B", prize = mutableMapOf("day_5" to 40, "day_4" to 80)) )
方案1:直接修改原列表中的Activity对象
如果允许修改原始对象属性,直接遍历列表修改每个对象的prize字段即可:
myList.forEach { activity -> // 对prize的所有非空值求和,prize为null时求和结果为0 val sum = activity.prize?.values?.filterNotNull()?.sum() ?: 0 // 替换为仅包含total的新Map activity.prize = mutableMapOf("total" to sum) }
执行后myList里的对象就已经是你要的结果。
方案2:生成新的对象列表(不修改原对象,更推荐)
Kotlin数据类自带copy方法,可以基于原对象生成修改指定属性的新实例,配合map转换操作实现:
val resultList = myList.map { activity -> val sum = activity.prize?.values?.filterNotNull()?.sum() ?: 0 activity.copy(prize = mutableMapOf("total" to sum)) }
转换后resultList就是符合要求的新列表,原列表myList不会被改动。
代码说明
prize?.values:安全调用获取Map的所有值,prize为null时整体返回nullfilterNotNull():过滤掉值为null的元素,避免求和时出现空指针sum():对Int类型的集合求和?: 0:空合并运算符,当prize为null时求和结果默认取0
内容的提问来源于stack exchange,提问作者Erjon
相关产品推荐
相关产品推荐

