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

时间:2017-09-27 10:49:37

标签: 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)
  }

&#34; rangeExams&#34;是一个收集清单 我想结合Kotlin Collection of Collection, 将rangeExams的元素放入地图中 并将此地图放入新列表,
如何通过Kotlin简化此代码?

ExamAnswer是一个pojo:

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

感谢您的回复

2 个答案:

答案 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)
    }