-1

我正在编写一个函数来测试 HashMap 是否具有空值。方法 .values() 应该只返回一个值的集合,但是我收到一个包含存储在里面的键和值的映射。这不好,因为我的函数的目的是检查值是否为空,但是如果我返回一个带有键和值的映射,那么如果我有一个没有值存储的键,则 .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,这很糟糕,因为它应该检测是否没有值。帮助!

4

5 回答 5

4

没有像 Map 实现这样的东西,它存储了一个没有值的键。所有 Map 实现:

  • put当值为空时抛出异常
  • 添加一个键和值为 null 的条目

映射到 null 的键与没有值的键非常不同。键有一个值,该值为 null(这意味着值集合不会为空,除非地图为空)。没有值的键是映射中不包含的键。

长话短说,你可能想使用MAPNAME.values().contains(null)甚至只是MAPNAME.containsValue(null)做你想做的事。或者,如果您要检查每个键是否映射到 null,请通过迭代 .values() 集合来检查。

于 2012-05-14T17:48:30.730 回答
1

您正在返回地图——MAPNAME,而不是值:

return MAPNAME.values();
于 2012-05-14T17:19:43.500 回答
0

如果您尝试确定地图是否包含任何空值,则应遍历值的集合并检查每个值以查看其是否为空。

包含具有 null 值的条目的映射不为空。

于 2012-05-14T17:35:14.620 回答
0

你不是很清楚你想要什么——你的映射值是列表——考虑到这一点,有三种方法可以将键映射到“无值”:

  • 映射到的键null(然后测试是map.values().contains(null)
  • 映射到空列表的键(然后测试是map.values().contains(Collections.emptyList())
  • 映射到充满nulls 的列表的键。

如果地图确实为空(没有键),您上面的方法现在正在做的是抛出异常,否则返回地图。

目前尚不清楚您想要什么。如果您希望该方法仅在映射没有有意义的值时抛出异常(所有键都映射到 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值或空列表或nulls 列表。

(上面文本中的“空性”测试级别对应于代码中的注释标签)。

于 2012-05-14T18:16:13.900 回答
0

以这种方式使用 values() 方法:- Collection set=MAPNAME.values();

然后使用 foreach 循环检查每个值是否为空。

于 2020-06-12T21:47:09.543 回答