一つだけマップ検索で指定したキーの値をインクリメントするには?

マーティンDrozdík:

私は、地図を持っていると言います。

 var inventory = mutableMapOf("apples" to 1, "oranges" to 2)

そして、私は1つでリンゴの数をインクリメントします。

しかし、これは動作しません。

inventory["apples"]!!++ // Error:(9, 4) Variable expected

このどちら:

var apples = inventory["apples"]!!
++apples
println(inventory["apples"]) // prints "1" => the value was not incremented.

どのKotlinに、番号がされているので、驚くべきことである彼らは、一般的なオブジェクトのインスタンスに格納されている場合箱入り私はコピーが行われていることを期待していません。

唯一の方法は次のように何かをするようです:

var apples = inventory["apples"]!!
++apples
inventory["apples"] = apples
println(inventory["apples"]) 

これは、両方がマップ内の2件の検索を使用し、非常に醜いと長いです。

一つだけのルックアップを使用して、指定されたキーの値をインクリメントする方法はありますか?

最初の2つの方法が動作しない理由はまた、誰かが説明できますか?

模擬:

一つだけと値インクリメントする方法はありませんgetとせずにputあなたは、常に実行する必要がputあるため、その後はInt不変です。inc()この方法は、(++必要がマップに格納されるという新たな値を返すためのショートカットです)。これは、格納された値を変更しません。

あなたは使用することができます

inventory.computeIfPresent("apples") { _, v -> v + 1 }

1行でそれを書くために、しかし、あなたが実装に見れば、それはまたやるだろうget()し、新しい値を計算してみませんかput()その後。あなたが書かなければならない、しかし、あなたは、実行時にCPUサイクルを保存しませんコードの行を保存することができますので。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=223145&siteId=1
おすすめ