假设我们有一个Map<Key, Collection<Value>> myMap
和一个从密钥关联的集合中删除值的方法。如果删除一个值会使集合变空,我们想要删除地图中的key
条目:
List<Value> removeValue(Key key, Value value) {
List<Value> v = myMap.get(key);
if (v != null) {
v.remove(value);
if (v.isEmpty())
myMap.remove(key);
}
return v;
}
是否有任何Java 8方法可以使用单线程或更短的方法来实现所描述的行为?
答案 0 :(得分:7)
您可以使用computeIfPresent
:
static <K, V> List<V> removeValue(K key, V value, Map<K, List<V>> map){
return map.computeIfPresent(key, (k, l) -> l.remove(value) && l.isEmpty() ? null : l);
}
如果值不是computeIfPresent
,则{p> BiFunction
会将null
应用于关键字以及地图中的当前值(如果null
computeIfPresent
返回如果返回值不是null
,则将值设置为BiFunction
的返回值,如果返回值为{{1},则将值从映射中删除最后返回新值。
请注意,它的行为与您提出的方法略有不同 - 它不会从地图中移除已经空的null
,因为null
将返回List
。如果您要删除已经空的remove
,可以使用false
。