为什么是v!=无效的?v++:1与(v!=无效的?v:0)+1在hashmap.compute上递增一个键?

sg3maiej  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(398)

我想应用一个计算方法,如果键值存在,则递增值,否则放入1。有

Map<Integer, Integer> map = new HashMap<>();

我不明白为什么

for (int i = 0; i < 10; i++) map.compute(1, (k, v) -> v != null ? v++ : 1);

结果 {1=1}

for (int i = 0; i < 10; i++) map.compute(1, (k, v) -> (v != null ? v : 0) + 1);

结果 {1=10} ?
我对第一个案例的理解是:
如果键有值 k ,从中获取结果 v++ 把它放回去,否则用1填充
第二种情况是:
如果k有一个值 k 保存 v+1 相反,否则保存 0+1 ,也是1
在这种情况下为什么要跑 v++ 不会导致 v+1 ?

ldfqzlk8

ldfqzlk81#

因为 (k, v) -> (v != null) ? v++ : 1 在第一次迭代后总是返回1。
在第一次迭代中, v != null 将评估为false和 1 将Map到密钥 1 . 在所有后续调用中,条件都将为true,并且 v++ 将被使用,事实上 v++ 正在使用中, 1 将始终是新的Map值(而不是2)。 v++ 递增lambda表达式的本地参数,而不是Map中的值(记住,java是按值传递的)
如果你使用 ++v 而不是 v++ ,你也会得到10分。这将起作用,因为新Map的值已经递增(不像 v++ 它取值然后递增 v ) (v != null ? v : 0) + 1 ,另一方面,将始终添加 1 到当前Map的值(它不受 v++ )

相关问题