ConcurrentHashMap:仅当当前值较小时如何替换条目的值

Moh*_*vaf -1 java hashmap

我想要:

  1. 如果没有该条目的条目,则向ConcurrentHashMap添加条目,或
  2. 仅当当前值较小时,才替换键的值.

我想出了下面的代码,但正确的是它有(而且),它看起来很可怕:)

我想和你们一起检查一下.你认为它有效吗?

// Input: map, k, t
while (true) {
    if (map.containsKey(k)) {
        current = map.get(k);
        if (current != null && current < t) {
            if (map.replace(k, current, t))
                break;
        } else if (current != null && current >= t) {
            break;
        }
    } else {
        pre = map.putIfAbsent(k, t);
        if (pre == null)
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

ysh*_*vit 5

如果您使用的是Java 8,则可以使用该merge方法.它需要:

  • 映射到的关键K.
  • 如果K处还没有值,则使用值V.
  • 一个BiFunction<K,K,V>结合在K的v任何已经存在的值,并将其存储˚F

对于您的用例,您将拥有:

  • K:你的钥匙
  • V:新值
  • F:比较其两个输入的函数,并返回两者中的较高者

如果K上还没有值,它只会存储V.否则,它会将新的V和旧的V传递给你的函数,并将结果存储在K.因为你的函数返回两者中的较高者,如果它高于前一个值,则相当于替换该值.