我正在编写一个函数来测试HashMap是否具有空值。方法.values()应该返回一个只包含值的集合,但是我会收到一个包含存储在其中的键和值的映射。这是不好的,因为我的函数的目的是检查值是否为null,但是如果我返回带有键AND值的映射,那么.values()。isEmpty()如果我没有存储没有值的键,则返回false。
public Map<KEY, List<VALUES>> methodName() {
if (MAPNAME.values().isEmpty()) {
throw new CustomErrorException(ExceptionHandler.getErrorWithDescription(ErrorConstants.ERROR_MSG_01));
} else {
return MAPNAME;
}
}
在上面的示例中,.values()始终返回包含所有键和值的映射。如果HashMap有一个键,我的方法永远不会抛出一个CustomErrorException,因为它应该检测是否没有值。救命啊!
答案 0 :(得分:4)
没有像Map实现那样存储没有值的密钥。所有Map实现都是:
put
中抛出异常映射到null的键与没有值的键非常不同。键具有值,该值为null(这意味着值集合不会为空,除非映射为空)。没有值的键是地图中未包含的键。
长话短说,您可能希望使用MAPNAME.values().contains(null)
甚至MAPNAME.containsValue(null)
来做您想做的事情。或者,如果您检查每个键都映射为null,请通过迭代.values()集合来检查它。
答案 1 :(得分:1)
您要返回地图 - MAPNAME,而不是值:
return MAPNAME.values();
答案 2 :(得分:0)
如果您正在尝试确定地图是否包含任何空值,则应迭代值集合并检查每个值以查看其是否为空。
包含空值条目的地图不为空。
答案 3 :(得分:0)
你不是很清楚自己想要什么 - 你的地图值是列表 - 考虑到这一点,有三种方法可以将关键地图设为“无值”:
null
的密钥(然后测试为map.values().contains(null)
)map.values().contains(Collections.emptyList())
)null
s。上面你正在做的方法是,如果地图真的是空的(没有键),则抛出异常,否则返回地图。
目前尚不清楚你想要什么。如果你希望方法只在地图没有有意义的值(所有键映射到null或空列表)时抛出异常,那么你需要这样的东西:
public Map<KEY, List<VALUES>> methodName() {
for( List<VALUES> values : MAPNAME.values() ) // 1
if( null != values ) // 2
for( VALUES value : values ) // 3
if( null != value ) // 4
return MAPNAME;
throw new CustomErrorException(ExceptionHandler.getErrorWithDescription(ErrorConstants.ERROR_MSG_01));
}
这会在所有合理可能的“空映射”场景中引发异常 - 如果(1)地图真的为空,或者(2)它只包含null
个键,或者(3)它只包含仅限null
个值或空列表,或(4)它仅包含null
值或空列表或null
s列表。
(上面文本中的“空虚”测试级别对应于代码中的注释标签)。
答案 4 :(得分:0)
以这种方式使用values()方法: 集合set = MAPNAME.values();
然后使用foreach循环检查每个值是否为空。