我需要检查地图中的所有值是否为空,我有这个方法,如果可能的话我想用内置的方法替换。限制:Java 5和访问Apache Commons库。
/* Checks if all values are null */
public static boolean isEmpty(Map<Dboid,?> aMap){
boolean isEmpty = true;
Iterator<?> it = aMap.entrySet().iterator();
while(it.hasNext() && isEmpty){
Object value = it.next();
if(value != null) {
isEmpty = false;
}
}
return isEmpty;
}
答案 0 :(得分:6)
另一种不使用任何第三方库的解决方案。
Collections.frequency(aMap.values(), null) == aMap.size()
答案 1 :(得分:3)
因此没有直接的方法,但您可以使用Apache Commons CollectionUtils.countMatches()
方法,并将NullPredicate
实例传递给它。当然,您可以使用Map#values()
方法传递地图中的值:
public static <K, V> boolean hasAllNullValues(Map<K, V> map) {
int size = map.size();
return CollectionUtils.countMatches(map.values(), NullPredicate.INSTANCE) == size;
}
甚至更好,使用CollectionUtils.exists()
方法检查是否至少有一个元素满足作为第二个参数传递的NotNullPredicate
:
public static <K, V> boolean hasAllNullValues(Map<K, V> map) {
return !CollectionUtils.exists(map.values(), NotNullPredicate.INSTANCE);
}
答案 2 :(得分:3)
我知道问题是针对Java 5的,但对于那些像我一样从Google搜索中来到这里的人来说:
对于Java> = 8,您可以执行以下操作:
boolean allValuesAreNull = yourMap.values()
.stream()
.allMatch(Objects::isNull);
有一个细微差别:空白地图将为true
。
答案 3 :(得分:2)
没有内置方法可以做到这一点。特别是,没有任何东西可以“找到不等于某事物的元素”。
但是,如果您的业务规则将仅包含null
值的地图定义为“空”,则这似乎意味着null
值意味着“不存在”,在这种情况下,可能希望构造代码,以便首先不会添加null
值。然后你可以使用内置的isEmpty()
。
答案 4 :(得分:2)
怎么样
return CollectionUtils.find(aMap.values(),NotNullPredicate.INSTANCE).isEmpty();
答案 5 :(得分:1)
没有API可以为您提供,但您可以稍微优化该方法。
无需在每次迭代时检查isEmpty变量。
这是一个小小的优化。
/* Checks if all values are null */
public static <K,V> boolean isMapEmpty(Map<K,V> aMap){
for (V v: aMap.values()) {
if (v != null) { return false; }
}
return true;
}