2017-11-28 5 views
1
var t = 0 
fun sumIntMap(hm: HashMap<Int,Int>) = hm.forEach{ x -> t+=x.value 
}.let { t } 

ここで関数を使ってHashmap Int値を合計しようとすると、temp var(t)をキャプチャして必要としないように最適化できないようです。ラムダ式の開発

ラムダで一時的なバールを使用して戻すにはどうすればよいですか?どのように私はそれを唯一の本当の方法(temp varを返すletを使用して)を書いたのですか?

ありがとうございます!

答えて

4

あなたはintのリストを取得するために、それらの値にあなたのHashMapエントリをマッピングし、そのリスト内の値を合計することができます

hm.map { it.value }.sum() 

あなたの代わりにMapListを持っている場合は、あなたも使用することができますラムダは、複数のVARSを扱うときに(そこ

hm.toList().fold(0, { acc, pair -> acc + pair.second }) 
+0

こんにちはは、本当に私は、ラムダから特定の値を返すの一般的な概念を見ていた:foldまたはreduceは、元のコードに似た事をしますこのケースx&t)letを使って私はこれをすることができますが、それはチェーンなしでラムダ自体の中で行うことができますか? –

+1

@HiLo、私はあなたが何を求めているかは100%確信していませんが、おそらくあなたは['reduce']を探しています(https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/ reduce.html)、これはもっと一般的な 'sum'です。 – chris

+0

あなたは 'fold'や' reduce'のような連鎖呼び出しや演算子を使う必要があります。それらは 'List'でも利用可能であり、' Map'では利用できません。 あなたのコードに似ている、あなたが探しているものかもしれない、 'fold'を使って私の答えを編集しました。 – zsmb13