Kotlin,如何使用集合函数来简化这段代码
我正在使用Kotlin进行一个项目,我写这个代码可以完成这个要求:
val rewards = ArrayList<Map<String, Int>>() rangeExams .forEach { examAnswer -> var reward = hashMapOf("Score" to examAnswer.answerScore) var questionIds = examAnswer .answers .map { it.id } reward.put("NewQuestion", questionIds.size) rewards.add(reward) }
“rangeExams”是一个收藏列表。
我想结合Kotlin Collection的函数,把rangeExample的元素放到地图中,并把这个地图放到一个新的列表中,
我怎么能通过Kotlin简化这个代码?
ExamAnswer是一个pojo:
class ExamAnswer (val id: String, val answerScore: Int, val answers:List<Answer>)
谢谢您的回复
由于您为rangeExams
每个元素添加了一个项目,所以.forEach { ... }
调用可以转换为.map { ... }
。
此外,您只能使用examAnswer.answers.map { it.id }
的结果来获取其大小,因此您可以删除.map { it.id }
并使用原始集合的大小。
如果之后不需要改变地图,可以用hashMapOf(...)
替换hashMapOf(...)
mapOf(...)
。
val rewards = rangeExams.map { mapOf( "Score" to it.answerScore, "NewQuestion" to it.answers.size) }
如果您需要在创建后更改rewards
列表,请在最后添加.toMutableList()
。
有一点可能简化这个。
- 首先,我会建议一个更实用的方法,这可以将可变的列表
rewards
变成一个不可改变的列表。 - 其次,推导出哈希映射
reward
的创建。 你可以使用映射的不可变版本,而不是使用hashMapOf
创建的可变hashMapOf
(如果需要可变性,则可以保留hashMapOf
)。 - 第三,你只是使用
questionIds
ID的大小。 为此,您不必映射任何内容,只需调用examAnswer.ansers.size
。 这个简短的电话也可以推断出来 - 第四,你可以使用
it
而不是显式地命名参数examAnswer
因为这个块现在是相当短的
这将导致这个代码:
val rewards = rangeExams.map { mapOf("Score" to it.answerScore, "NewQuestion" to it.answers.size) }