在原子值的情况下从地图中删除键
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");
}
我想从地图中删除键,以防键的值为 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");
}