我正在使用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)
}
&#34; rangeExams&#34;是一个收集清单
我想结合Kotlin Collection of Collection,
将rangeExams的元素放入地图中
并将此地图放入新列表,
如何通过Kotlin简化此代码?
ExamAnswer是一个pojo:
class ExamAnswer (val id: String, val answerScore: Int, val answers:List<Answer>)
感谢您的回复
答案 0 :(得分:3)
由于您为rewards
的每个元素向rangeExams
添加了一个项目,因此.forEach { ... }
调用可以转换为.map { ... }
。
此外,您只使用examAnswer.answers.map { it.id }
的结果来获取其大小,因此您可以删除.map { it.id }
并使用原始集合的大小。
如果您之后不需要改变地图,可以将hashMapOf(...)
替换为mapOf(...)
。
val rewards = rangeExams.map {
mapOf(
"Score" to it.answerScore,
"NewQuestion" to it.answers.size)
}
如果您需要在创建rewards
列表后进行变更,最后添加.toMutableList()
。
答案 1 :(得分:2)
简化这一点有一点潜力。
rewards
转换为不可变列表。reward
的哈希图put
的创建推断为一行。您可以使用地图的不可变版本,而不是hashMapOf
创建的可变版本(如果您需要可变性,则可以保留hashMapOf
)。questionIds
大小。为此,您无需映射任何内容,只需致电examAnswer.ansers.size
即可。这个简短的电话也可以推断it
而不是明确命名参数examAnswer
,因为无论如何此块现在都很短这将导致此代码:
val rewards = rangeExams.map {
mapOf("Score" to it.answerScore,
"NewQuestion" to it.answers.size)
}