我想应用一个计算方法,如果键值存在,则递增值,否则放入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
?
1条答案
按热度按时间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++
)