如果键的值为零(0),我想从地图中删除键我可以使用map.values().removeAll(Collections.singleton(0l));
实现它
。
在我使用 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的键。任何人都可以提出解决方案,这将是非常有帮助的。
感谢。
答案 0 :(得分:2)
如果您使用的是Java8,则可以使用removeIf
方法。
atomicMap.values().removeIf(x -> x.get() == 0L);
// Prints {Gema=1, Andrew=1}
答案 1 :(得分: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}
答案 2 :(得分:1)
如果你想计算然后决定在值为零时删除。
if (atomicMap.compute("Andrew", (k, v) -> v.decrementAndGet()) == 0) {
atomicMap.remove("Andrew");
}