一种检查集合或映射是否为空或为null的方法?

4

我希望检查一个Map、HashMap、ArrayList、List或者任何Collections中的内容是否为空或null?

我有下面这段代码,但是当我传递一个Map时它不起作用:

protected static <T extends Collection, Map> boolean isCollectionMapNullOrEmpty(final T c) {
  if (c == null) {
      return true;
  }

  return c.isEmpty();
 }

失败:

  List<String> aList = Arrays.asList("a1", "a2", "a4");
  Map<String, Object> aMap = new HashMap<String, Object>();
  aMap.put("a2", "foo");
  aMap.put("a1", "foo");
  aMap.put("a3", "foo");
  aMap.put("a4", "foo");
  System.out.println(isCollectionMapNullOrEmpty(aList));  // works

  // fails with The method isCollectionMapNullOrEmpty(T) in the type LearnHashMap is not applicable for the arguments (Map<String,Object>)
  System.out.println(isCollectionMapNullOrEmpty(aMap));

2
<T extends Collection, Map> 声明了两个类型变量:T 受原始 Collection 限制,而 Map 则没有限制。 - Savior
2
你必须进行类型转换才能完成。听起来像是一个 XY 问题。 - shmosel
3
编写两个方法,一个用于地图(maps),另一个用于集合(collections)。 - MadProgrammer
3个回答

5

您的isCollectionMapNullOrEmpty编译并工作了,但不是您预期的方式。

<T extends Collection, Map>

您声明了两个类型变量T和Map,其中T必须是Collection接口。类型变量Map与Map接口无关,并且实际上没有被使用。(同时,您在此处使用了原始Collection接口。)您正在传递aList,它是一个Collection,因此可以编译。但是,aMap不是Collection,因此编译失败,传入了一个Map。
看起来您想让T成为Collection或Map。但是Java的泛型不能这样工作;您不能将类型参数声明为一件事物或另一件事物。
(另外,您可以说一件事情和另一件事情:T extends Collection & Map,或者没有原始类型,T extends Collection<?> & Map<?, ?>,但我不知道任何实现两个接口的类。)
您可以有两个重载的方法,一个用于Collection,一个用于Map,执行相同的功能。在这里,我利用了短路来合并语句:
protected static boolean isCollectionMapNullOrEmpty(final Collection<?> c) {
    return c == null || c.isEmpty();
}
protected static boolean isCollectionMapNullOrEmpty(final Map<?, ?> m) {
    return m == null || m.isEmpty();
}

这两种方法的代码完全相同,但是因为没有超级接口声明isEmpty,所以似乎只能这样了。


0
你有这个方法(link):

boolean org.apache.commons.collections.CollectionUtils.isEmpty(Collection coll)

该方法可以进行空值安全检查,以判断指定的集合是否为空。这样,你就不必再检查空值或定义自定义方法了。

0

if(storeMAPDetails.size==0) 你可以直接这样检查你的map是否为空!


1
如果它是空的,你会得到一个 NPE。 - vstoyanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接