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

Java 检查映射中的所有值是否为空,java,map,Java,Map,我需要检查映射中的所有值是否为null,如果可能的话,我有一个内置的方法来替换这个方法。限制:Java5和对ApacheCommons库的访问 /* Checks if all values are null */ public static boolean isEmpty(Map<Dboid,?> aMap){ boolean isEmpty = true; Iterator<?> it = aMap.entrySet().iterator();

我需要检查映射中的所有值是否为null,如果可能的话,我有一个内置的方法来替换这个方法。限制:Java5和对ApacheCommons库的访问

/* 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;
}
/*检查所有值是否为空*/
公共静态布尔值isEmpty(映射aMap){
布尔值isEmpty=true;
迭代器it=aMap.entrySet().Iterator();
while(it.hasNext()&&isEmpty){
对象值=it.next();
if(值!=null){
isEmpty=false;
}
}
返回是空的;
}

没有内置的方法来执行此操作。特别是,没有任何东西可以提供“找到不等于某事物的元素”的方法


但是,如果您的业务规则将仅包含
null
值的映射定义为“空”,则这似乎意味着
null
值表示“不存在”,在这种情况下,您可能希望构造代码,使
null
值从一开始就不会添加。然后您就可以使用内置的
isEmpty()

没有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;
}
/*检查所有值是否为空*/
公共静态布尔isMapEmpty(Map aMap){
对于(V:aMap.values()){
如果(v!=null){return false;}
}
返回true;
}

因此,并没有直接的方法,但您可以使用该方法,并向其传递一个实例。当然,您可以使用
map#values()
方法传递映射中的值:

public static <K, V> boolean hasAllNullValues(Map<K, V> map) {
    int size = map.size();
    return CollectionUtils.countMatches(map.values(), NullPredicate.INSTANCE) == size;
}
怎么样

return CollectionUtils.find(aMap.values(),NotNullPredicate.INSTANCE).isEmpty();

不使用任何第三方库的另一个解决方案

Collections.frequency(aMap.values(), null) == aMap.size()

我知道这个问题是针对Java 5的,但对于那些像我一样从google search来到这里的人来说:

对于Java>=8,您可以执行以下操作:

boolean allValuesAreNull = yourMap.values()
        .stream()
        .allMatch(Objects::isNull);

有一点细微差别:对于空映射,它将是
true

你这里的native是什么意思?我猜OP native是指他自己的方法这不应该被命名为
isEmpty
,因为有键,但是附加的值可能是
null
。一旦找到非null值,你应该立即中断。.遍历
entrySet()
总是返回
Map.Entry
对象,永远不要为null,即使Map条目中的键或值恰好为null。@Jason typpo-必须是aMap.values();优化之处在于,他不需要在每次迭代中使用额外的变量和额外的检查。。总而言之。嘿,投反对票是为了什么?最有可能的只是想帮助男人,这是没有意义的。请提供基准和概要数据以支持该声明,并与OP的实际性能要求进行比较,然后再建议将过早的微优化作为有效方法。鼓励这种思维过程弊大于利,这正是为什么我们要避开这么多与“性能”相关的问题。我同意——这是对代码的微观优化和清理。这就是我所提供的一切。。。谢谢你的投票。@Deian检查while循环中的isEmpty标志。看起来与Rohit的答案相同。是的,但这是更好的回报!CollectionUtils.exists(map.values(),NotNullPredicate.INSTANCE);
boolean allValuesAreNull = yourMap.values()
        .stream()
        .allMatch(Objects::isNull);