如何在任何Java映射实现上测试空键?

如何在任何Java映射实现上测试空键?,java,collections,Java,Collections,我希望确保作为参数传递给方法的映射不包含空键。我们可以假设如下情况: if ( map.containsKey(null) ) … 但是,如果该方法被传递类似于TreeMap的东西,则该方法将被破坏,而根据通用Java映射契约,它是 在接受任何映射实现时,我们是否有合理的方法来测试空键?boolean hasNullKey(映射映射){ boolean hasAnyNull = yourMap.keySet() .stream() .anyMatch(Objects::

我希望确保作为参数传递给方法的映射不包含空键。我们可以假设如下情况:

if ( map.containsKey(null) ) …
但是,如果该方法被传递类似于
TreeMap
的东西,则该方法将被破坏,而根据通用Java映射契约,它是

在接受任何映射实现时,我们是否有合理的方法来测试空键?

boolean hasNullKey(映射映射){
boolean hasAnyNull = yourMap.keySet()
      .stream()
      .anyMatch(Objects::isNull);
试一试{ 返回map.containsKey(空); }捕获(NullPointerException e){ 返回false; } }

请注意,当
map
本身为
null
时,这也会返回
false
,这可能是需要的,也可能不是需要的。

使用
instanceof
查找树映射

boolean hasNullKey(Map<?,?> map) {
    return map instanceof TreeMap ? false :map.containsKey(null);
}
布尔hasNullKey(映射){
返回树映射的映射实例?false:map.containsKey(null);
}

System.out.println(hasNullKey(null));此语句也打印为false。@JoachimSauer异常以控制流。。。我不知道,不是因为我的taste@gifpif:是的,这正是我的便条上写的。@Eugene:不好,但不是O(n)。我认为问题本身已经包含了一些有问题的假设,为什么
null
键的存在是相关的,而代码接受不能有
null
键的映射?似乎需要用更严格的规范来修复。@a'B:好的,那么这里的“错误条件”到底是什么<在映射或不允许“null”的映射实现中的code>null?如果是前者,您可以运行代码,捕获不可避免的异常,然后运行一些(可能代价高昂的)检查,以确定异常是否由已知问题引起,例如将损坏的参数传递给代码,并提供适当的错误消息。这可能必须循环所有键,当您正确使用
映射
@JoachimSauer时,这通常正是您想要避免的,但是在映射上循环可能比使用整个stacktrace构建
异常
更便宜。JavaDoc说:"... 抛出NullPointerException-如果指定的键为null,并且此映射使用自然排序,或者其比较器不允许使用null键“-A
TreeMap
可能包含空键,如果它的比较器可以处理它们。@LuCio通常每个
Map
,因为
HashMap
禁止空键;这是
CHM/Map::of
etc的情况;拥有这个空值只是软方面的一个痛苦,那么其他不允许
null
的映射呢,比如
EnumMap
boolean hasNullKey(Map<?,?> map) {
    return map instanceof TreeMap ? false :map.containsKey(null);
}