2017-01-27 1 views
2

プロジェクトをKotlinに移行する必要があります。後で、私はthis issueに質問しました。そして、私は本当にKotlinでそれを実装する方法を得ることができません。私は 'associateBy'関数について知っていますが、Java 8 'groupBy'が持つ引数の量はありません。ラムダで実装する方法ですか?もしそうでなければ、どうすればこのアルゴリズムをそれなしで実装できますか?KotlinのリストEnumMap to sum

答えて

4

現在、最も簡単な解決策は合計に変換し、最初の.groupBy { }でグループ化を生成し、その後.mapValuesTo() { }でグループを処理することです:

val result = marks 
     .groupBy(Mark::subject) 
     .mapValuesTo(EnumMap(Subject::class.java)) { it.value.sumBy(Mark::value) } 

Kotlin 1.1がリリースされた後、新しいSTDLIB機能shown in Kotlin 1.1 Betaがしますあなたは中間グループマップなしで同じことをすることができます。代わりに、コレクションは、このコードを一度だけ処理されます。

val result = marks 
     .groupingBy(Mark::subject) 
     .foldTo(EnumMap(Subject::class.java), 0) { acc, it -> acc + it.value } 
+0

あなたは 'Grouping'に代わりfoldTo''の 'eachCountTo'メソッドを使用することができます:' .eachCountTo(EnumMap(件名:: class.java) ) ' – marstran

+0

@marstran、それは' value'sを合計しませんよね? – hotkey

+0

ああ、私は質問を誤解しました。私は彼が各科目の印を数え上げたいと思った。 – marstran

関連する問題