我想检查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));
答案 0 :(得分:3)
您的isCollectionMapNullOrEmpty
可以编译和运行,但不能达到您的预期目的。
<T extends Collection, Map>
您已经声明了两个类型变量T
和Map
,其中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) 您可以直接执行此操作以检查地图是否为空!