java - 检查 Collection 或 Map 是否为空或 null 的方法?
问题描述
我想检查 Map、HashMap、ArrayList、List 或 Collections 中的任何内容是 Empty 还是 null?
我有这个,但是当我通过地图时它不起作用:
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));
解决方案
您的isCollectionMapNullOrEmpty
编译和工作,但不是您想要的方式。
<T extends Collection, Map>
您已经声明了两个类型变量,T
并且Map
, whereT
必须是Collection
. 类型变量Map
与接口无关Map
,实际上甚至没有使用。(此外,您在这里使用了原始Collection
接口。)您传递aList
的是 a Collection
,因此它可以编译。但是,aMap
is not a Collection
,因此编译失败传入 a Map
。
看起来你想T
成为 aCollection
或a Map
。但是 Java 的泛型不是这样工作的。您不能将类型参数声明为一件事或另一件事。
(顺便说一句,您可以说一件事和另一件事:T extends Collection & Map
,或者没有原始类型,T extends Collection<?> & Map<?, ?>
但我不知道有任何类实现了这两个接口。)
您可以有两个重载方法,一个用于 a Collection
,一个用于 a 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
,这似乎是最好的。
推荐阅读
- c# - 如何将 x-www-form-urlencoded post Message 转换为 JSON post Message?
- r - 使用 dplyr 和 tbrf 滚动几何均值
- mautic - 将 Mautic 退回的电子邮件状态与 SalesForce 同步
- scala - 如何在时间窗口内获取最新值
- c# - IIS 8/Angular2+/C# 上的上传进度错误
- css - 浮动元素背景颜色
- javascript - 没有条件的while循环如何工作?
- python - 如何删除 GuidedLDA 实施中出现的警告
- angular - Angular 6 Grid Tiles 换行符
- symfony4 - symfony4:没有扩展能够加载“doctrine_mongodb”的配置