在原子值的情况下从地图中删除键

Removing key from Map in case of Atomic Values

我想从地图中删除键,以防键的值为 zero(0) 我可以使用
[=11 实现它=]


在我使用 Map<String,Long> 之前它工作得很好,但现在我们已经将实现更改为 Map<String,AtomicLong> 现在它不会删除值为零的键,因为我使用原子变量作为值。
我试过的小代码片段 ::

    Map<String, AtomicLong> atomicMap = new HashMap<String,AtomicLong>();
    atomicMap.put("Ron", new AtomicLong(0l));
    atomicMap.put("David", new AtomicLong(0l));
    atomicMap.put("Fredrick", new AtomicLong(0l));
    atomicMap.put("Gema", new AtomicLong(1l));
    atomicMap.put("Andrew", new AtomicLong(1l));    

    atomicMap.values().removeAll(Collections.singleton(new AtomicLong(0l)));

    System.out.println(atomicMap.toString());

输出为
{Ron=0, Fredrick=0, Gema=1, Andrew=1, David=0}

如您所见,没有删除值为 0 的键。任何人都可以提出解决方案,这将有很大帮助。
谢谢。

如果您使用 Java8,可以使用 removeIf 方法。

atomicMap.values().removeIf(x -> x.get() == 0L);
// Prints {Gema=1, Andrew=1}

AtomicLong 的两个实例永远不相等。如果您查看 AtomicLong,您会发现它从不覆盖 equal() 方法。参见 Why are two AtomicIntegers never equal?

您可以使用自己的自定义 AtomicLong 实现来解决这个问题,该实现实现 equals() 并使您的删除元素的策略有效。

public class MyAtomicLongExample {

    static class MyAtomicLong extends AtomicLong {

        private static final long serialVersionUID = -8694980851332228839L;

        public MyAtomicLong(long initialValue) {
            super(initialValue);
        }

        @Override
        public boolean equals(Object obj) {
            return obj instanceof MyAtomicLong && ((MyAtomicLong) obj).get() == get();
        }
    }

    public static void main(String[] args) {
        Map<String, MyAtomicLong> atomicMap = new HashMap<>();
        atomicMap.put("Ron", new MyAtomicLong(0l));
        atomicMap.put("David", new MyAtomicLong(0l));
        atomicMap.put("Fredrick", new MyAtomicLong(0l));
        atomicMap.put("Gema", new MyAtomicLong(1l));
        atomicMap.put("Andrew", new MyAtomicLong(1l));    

        atomicMap.values().removeAll(Collections.singleton(new MyAtomicLong(0l)));

        System.out.println(atomicMap);
    }

}

这将打印 {Gema=1, Andrew=1}

如果你想计算然后决定在值为零时删除。

if (atomicMap.compute("Andrew", (k, v) ->  v.decrementAndGet()) == 0) {

      atomicMap.remove("Andrew");
}