Kotlin,如何使用集合函数来简化这段代码

我正在使用Kotlin进行一个项目,我写这个代码可以完成这个要求:

val rewards = ArrayList<Map>() 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”是一个collections列表。
我想结合Kotlin Collection的函数,把rangeExample的元素放到地图中,并把这个地图放到一个新的列表中,
我怎么能通过Kotlin简化这个代码?

ExamAnswer是一个pojo:

 class ExamAnswer (val id: String, val answerScore: Int, val answers:List) 

谢谢您的回复

由于您为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) }