如果值为空,则删除键

dab*_*aba 3 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;
}
Run Code Online (Sandbox Code Playgroud)

是否有任何Java 8方法通过单线程或更短的方法来实现所描述的行为?

Ale*_*lex 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);
}
Run Code Online (Sandbox Code Playgroud)

computeIfPresent施加BiFunction到键和在地图中的当前值,如果该值不是null(如果它是null computeIfPresent返回null立即),然后或者将值设置到的返回值BiFunction,如果返回值不是null或删除从地图如果密钥返回值是null,最后返回新值.

请注意,它的行为与您提出的方法略有不同 - 它不会List从地图中删除已经为空的因为remove将返回false.如果你想删除已经空的List你可以使用l.isEmpty() || (l.remove(value) && l.isEmpty()).