让我们考虑以下代码:
ConcurrentHashMap<String, Set<String>> map = new ConcurrentHashMap<>();
// Add element: {mapKey, setValue}
map.computeIfAbsent(mapKey, new Function<String, Set<String>>() {
@Override
public Set<String> apply(String mapK) {
return ConcurrentHashMap.newKeySet();
}
}).add(setValue);
// Remove element: {mapKey, setValue}
Set<String> updatedSet = map.computeIfPresent(mapKey, new BiFunction<String, Set<String>, Set<String>>() {
@Override
public Set<String> apply(String mapK, Set<String> old) {
old.remove(setValue);
return old;
}
});
// I need remove mapKey, but I cannod do this like this, because of race condition bug
if (updatedSet.isEmpty()) {
map.remove(mapKey);
}
所以,我们看到的是
ConcurrentHashMap<String, Set<String>>
张地图,其中key
张地图是String
,而value
是ConcurrentHashSet
。set
为map
时,我需要删除set
,它是empty
的值。set
的幼稚删除。我的问题有什么绝妙的解决方法吗?
答案 0 :(得分:2)
select *
from TRN_SUMMARY
where :P2_DATE IS NULL
OR REP_DATE = :P2_DATE;
如果映射器返回computeIfPresent
,则删除该条目。如果要删除条目,请从映射器返回null
,而不是在单独的步骤中执行删除操作。
(此外,您实际上应该将null
折叠到.add(setValue)
映射器中,并使用computeIfAbsent
而不是compute
,因为您没有采取任何措施来保护立即computeIfAbsent
致电。也可以选择使用add
。)