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

时间:2016-07-20 05:59:01

标签: java hashmap

我想:

  1. 如果没有该条目的条目,则将条目添加到ConcurrentHashMap,或
  2. 仅当当前值较小时才替换键的值。
  3. 我提出了以下代码,但是正确的时候它是真的(真的),它对我来说很可怕:)

    我想和你们一起检查一下。你觉得它有效吗?

    // 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;
        }
    }
    

1 个答案:

答案 0 :(得分:5)

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

  • 要映射到
  • 的密钥K.
  • 如果K
  • 中还没有值,则使用值V.
  • 一个BiFunction<K,K,V> F,它将任何已存在的值与V组合,并将其存储在K

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

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

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