检查Map不包含空键和值

时间:2014-02-05 12:31:07

标签: java map hashmap guava

现在我有这个丑陋的代码来检查一个hashmap是否包含空键和值。 是否已准备好使用具有相同功能的Guava静态方法?

    if (map != null) {
        // Check map does not contains null key
        try {
            if (map.containsKey(null)) {
                throw new IllegalArgumentException("map contains null as key");
            }
        } catch (NullPointerException e) {
            //It is ok. Map does not permit null key.
        }

        // Check map does not contains null key
        try {
            if (map.containsValue(null)) {
                throw new IllegalArgumentException("map contains null price");
            }
        } catch (NullPointerException e) {
            //It is ok. Map does not permit null value.
        }
    }

3 个答案:

答案 0 :(得分:2)

不是真的。有

Preconditions.checkNotNull

你应该使用它。令人惊讶的是,它比你的简单检查更快(它被优化以更好地内联常见情况,即不抛出)。它会抛出NPE instead of IAE

还有MapConstraint个,AFAIK允许您创建这样的地图。

还有许多课程不允许null,例如ImmutableMap。理论上你可以做到

ImmutableMap.copyOf(map)

但这会不必要地创建副本。

答案 1 :(得分:0)

如果你可以从一开始就使用ImmutableMap,也许是通过它的Builder,你会在尝试插入空键或值时收到错误。所以这可能值得一看。

答案 2 :(得分:0)

这很简单:

public static <K,V>boolean containsNullKeysOrValues(Map<K,V> map){
    return containsNullKeys(map)|| containsNullValues(map);
}
public static <K, V> boolean containsNullKeys(Map<K, V> map) {
    return Iterables.tryFind(map.keySet(), Predicates.isNull()).isPresent();
}
public static <K, V> boolean containsNullValues(Map<K, V> map) {
    return Iterables.tryFind(map.values(), Predicates.isNull()).isPresent();
}

亲:您不必捕获任何NPE。

Con:在最坏的情况下,你必须迭代整个地图。两次。