现在我有这个丑陋的代码来检查一个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.
}
}
答案 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:在最坏的情况下,你必须迭代整个地图。两次。