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

Java ConcurrentHashMap:如何仅在当前值较小时替换条目的值,java,hashmap,Java,Hashmap,我想: 如果没有该键的条目,则向ConcurrentHashMap添加条目,或者 仅当当前值较小时,才替换键的值 我想出了以下代码,但由于它有while(true),我觉得它很可怕:) 我想和你们核实一下。你认为它有效吗 // Input: map, k, t while (true) { if (map.containsKey(k)) { current = map.get(k); if (current != null && curre

我想:

  • 如果没有该键的条目,则向ConcurrentHashMap添加条目,或者
  • 仅当当前值较小时,才替换键的值
  • 我想出了以下代码,但由于它有while(true),我觉得它很可怕:)

    我想和你们核实一下。你认为它有效吗

    // 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;
        }
    }
    
    //输入:map,k,t
    while(true){
    if(地图容器(k)){
    当前=map.get(k);
    if(当前!=null&¤t=t){
    打破
    }
    }否则{
    pre=地图上的putIfAbsent(k,t);
    如果(pre==null)
    打破
    }
    }
    
    如果您使用的是Java 8,则可以使用该方法。需要:

    • 要映射到的键K
    • 如果K处还没有值,则使用值V
    • 将任何现有值与V结合起来并存储在K处的F
    对于您的用例,您应该:

    • K:你的钥匙
    • 新价值观
    • F:比较两个输入并返回两个输入中较高值的函数

    如果K处还没有值,它将只存储V。否则,它将把新的V和旧的V传递给函数,并将结果存储在K处。由于函数返回两个值中较高的一个,如果该值高于以前的值,则相当于替换该值。

    是否尝试过?您是否在IDE调试器中运行它,并一次一行地对其进行检查?请这样做,这将比有人告诉你更有教育意义。顺便说一句,while(true)(或任何类型的循环)根本不需要
    iterating@JimGarrison为什么我不需要while(真的)?假设一个线程想要写t,但是映射已经有了键,所以它转到第一个If。然后在替换时,replace返回false,因为另一个线程同时将该值更改为高于当前值但小于t的值。因为线程“想要”写t(因为t更高),所以它需要重新开始。OP使用的是Java 8中添加的
    replace()
    ,所以OP使用的是Java 8。谢谢,我将尝试使用这种方法。顺便说一句,我是在分配更高的值,而不是更小的值。@MohammadRoohitavaf它应该是传递给该双函数的参数之一。这不管用吗?是的,这是第一个论点,谢谢。我希望我们有一个类似的方法删除。我也需要那个。我发现有一个remove函数,仅当当前值等于期望值时才删除,但如果当前值小于新值,则没有任何remove函数。