2017-12-26 11 views
3

私は、折り畳みによって配列をインデックス付きのマップに変換しようとしています。どういうわけかIntelliJは、私がUnitを返すアキュムレータを返すとフラグを立てます。私が返品を取り除くと、私は元々返却したいデータ型が必要であると訴える。少し遅れKotlin fold関数を使用して配列をマップに変換する方法は?

constructor(vararg items: Item){ 
    val itemMap = items.fold(mutableMapOf<Int, MutableList<Item>>(), { acc, item -> 
     if (acc.containsKey(item.state)) { 
      acc[item.state]?.add(item) 
     } else { 
      acc.put(item.state, mutableListOf(item)) 
     } 
     return acc 
    }) 

} 

そのので、私はおそらく非常に何かを明らかに見逃してここ(項目だけのデータクラスです)次のように

コードがあります。どんな助けでも大歓迎です。

おかげ

+1

'return'を削除します。 –

+5

FWIWでは、 'val itemMap = items.groupBy {it.state}'でこの全体を達成することもできます。 –

+0

ありがとう@OliverCharlesworth。これはずっと簡単です。私はgroupBy関数について知らなかった。 – Oliver

答えて

8

代わりreturnの資格[email protected]演算子を使用します。 Kotlinでは、修飾語なしのreturnは、 'fun(ラムダを無視する)'からの戻りを意味します。

val itemMap = items.fold(mutableMapOf<Int, MutableList<Item>>(), { acc, item -> 
    if (acc.containsKey(item.state)) { 
     acc[item.state]?.add(item) 
    } else { 
     acc.put(item.state, mutableListOf(item)) 
    } 
    [email protected] acc 
}) 

は、言語リファレンスにWhats does “[email protected]” mean?Return at Labelsを参照してください。 returnを省略

それともresult expressionを使用し、:

val itemMap = items.fold(mutableMapOf<Int, MutableList<Item>>(), { acc, item -> 
    if (acc.containsKey(item.state)) { 
     acc[item.state]?.add(item) 
    } else { 
     acc.put(item.state, mutableListOf(item)) 
    } 
    acc 
}) 

基本的には、折り目のこの種は、標準ライブラリに実装されています。.groupBy { ... }を参照してください。

関連する問題