如果值为空,则删除键

时间:2016-05-09 21:49:32

标签: java java-8

假设我们有一个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方法可以使用单线程或更短的方法来实现所描述的行为?

1 个答案:

答案 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