首页 文章

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

提问于
浏览
0

我正在使用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 of Collection,将rangeExams的元素放入一个 Map 中,并将这个 Map 放到一个新的列表中,
如何通过Kotlin简化此代码?

ExamAnswer是一个pojo:

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

谢谢您的回复

2 回答

  • 3

    由于您为 rangeExams 的每个元素向 rewards 添加了一个项目,因此 .forEach { ... } 调用可以转换为.map .

    此外,您只使用 examAnswer.answers.map { it.id } 的结果来获取其大小,因此您可以删除 .map { it.id } 并使用原始集合的大小 .

    如果之后不需要改变 Map ,可以将 hashMapOf(...) 替换为 mapOf(...) .

    val rewards = rangeExams.map { 
        mapOf(
            "Score" to it.answerScore,
            "NewQuestion" to it.answers.size)
    }
    

    如果你需要在创建后改变 rewards 列表,最后添加.toMutableList() .

  • 2

    简化这一点有一点潜力 .

    • 首先,我建议采用更具功能性的方法,将可变列表_2492753变为不可变列表 .

    • 其次,将 put 的哈希映射 reward 的创建推断为一行 . 你可以使用 Map 的不可变版本,而不是 hashMapOf 创建的可变版本(如果你需要可变性,那么你可以保持 hashMapOf ) .

    • 第三,你只需使用 questionIds 来表示大小 . 为此,您不必映射任何内容,只需调用 examAnswer.ansers.size 即可 . 这个短暂的呼叫也可以推断出来

    • 第四,您可以使用 it 而不是显式命名参数 examAnswer ,因为此块现在非常短

    这将导致此代码:

    val rewards = rangeExams.map { 
            mapOf("Score" to it.answerScore,
                  "NewQuestion" to it.answers.size)
        }
    

相关问题