检查映射中的所有值是否为空

时间:2014-03-14 17:35:12

标签: java map

我需要检查地图中的所有值是否为空,我有这个方法,如果可能的话我想用内置的方法替换。限制: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;
}

6 个答案:

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