一种检查Collection或Map是否为空或为空的方法?

时间:2018-10-16 23:46:15

标签: java dictionary generics collections

我想检查Maps,HashMap,ArrayList,List或Collections中的任何内容是否为空或为空?

我有这个,但是当我通过地图时它不起作用:

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));

4 个答案:

答案 0 :(得分:3)

您的isCollectionMapNullOrEmpty可以编译和运行,但不能达到您的预期目的。

<T extends Collection, Map>

您已经声明了两个类型变量TMap,其中T必须是Collection。类型变量Map与接口Map无关,实际上甚至没有使用。 (此外,您在此处使用了原始的Collection接口。)您正在传递aList的{​​{1}},因此可以对其进行编译。但是,Collection不是aMap,因此编译无法传递Collection

您似乎想让Map成为T 一个Collection。但是Java的泛型不是那样工作的。您不能将类型参数声明为另一件事。

(顺便说一句,您可以说一件事Map,或者没有原始类型,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(); } 的超级接口,所以这看起来和它一样好。

答案 1 :(得分:0)

Apache Collections提供了执行此操作的静态方法。您有理由编写自己的实现吗?

答案 2 :(得分:0)

您拥有方法(link):

  

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

wich具有null安全检查,如果指定的集合为空。 这样,您不必检查空值或定义自定义方法

答案 3 :(得分:0)

if(storeMAPDetails.size == 0) 您可以直接执行此操作以检查地图是否为空!