如何从HashMap中检索值集合

时间:2012-05-14 17:17:27

标签: java list map hashmap

我正在编写一个函数来测试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,因为它应该检测是否没有值。救命啊!

5 个答案:

答案 0 :(得分:4)

没有像Map实现那样存储没有值的密钥。所有Map实现都是:

  • 当值为空时在put中抛出异常
  • 添加一个包含密钥且值为null的条目

映射到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循环检查每个值是否为空。