2017-09-27 4 views
0

を簡素化するためにコレクション機能を使用する方法、私はこのコードが要件を完了することができ、書き込み: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によって、このコードを簡素化することができ
、マップ にrangeExamsの要素を入れて、新しいリストにこのマップを置くために収集、 のKotlin機能をcombinateたいですか?

ExamAnswerはPOJOです:

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

はお返事を

答えて

3

をありがとうあなたがrangeExamsの各要素に対してrewardsに項目を追加するので、.forEach { ... }呼び出しが.map { ... }に変換することができます。

また、examAnswer.answers.map { it.id }の結果を使用してサイズを取得するので、.map { it.id }を削除して元のコレクションのサイズを使用することができます。

マップを後で変更する必要がない場合は、hashMapOf(...)mapOf(...)に置き換えることができます。あなたはそれが作成後rewardsリストを変異させる必要がある場合は

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

、最後に.toMutableList()を追加します。

+1

また、 "it"を(answerScore、answers) - > –

+0

に置き換えることもできます。最後に '.toMutableList()'を呼び出すのではなく、 '.mapTo(mutableListOf()){...}'を使用して複数のコレクションを割り当てます。 –

+0

@hotkey 申し訳ありませんが、私はあなたの答えを~~。 ありがとう、私は私のコードを屈折させようとしており、正しく動作しています〜。 私はあなたの親切な援助に非常に感謝しています! –

2

これを単純化する可能性はわずかです。

  • まず、私は不変のものに変更可能なリストrewardsを回すことができ、より機能的なアプローチを、お勧めします。
  • 第2に、putのハッシュマップrewardの作成を1行に推論します。 hashMapOf(変更可能性が必要な場合は、hashMapOfのままにしておくよりも)によって作成された変更可能なマップの代わりに、マップの不変バージョンを使用することもできます。
  • 3番目に、サイズにquestionIdsを使用するだけです。そのためには、マップする必要はありません。examAnswer.ansers.sizeに電話するだけです。この短いコールは、第四にも
  • と推測できる、あなたはitを使用する代わりに、明示的にPARAM examAnswerに名前を付けることができ、このブロックは今、非常に短いので、とにかく

これは、このコードにつながる:

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

ありがとうございます〜あなたの返信はまた火格子です~~ –

関連する問題