在 Java 中验证 null 和空集合的最佳实践
Posted
技术标签:
【中文标题】在 Java 中验证 null 和空集合的最佳实践【英文标题】:Best practice to validate null and empty collection in Java 【发布时间】:2012-09-25 02:58:15 【问题描述】:我想验证一个集合是否为空和null
。谁能告诉我最佳做法。
目前,我正在检查如下:
if (null == sampleMap || sampleMap.isEmpty())
// do something
else
// do something else
【问题讨论】:
除此之外,想想为什么你使用null == sampleMap
而不是sampleMap == null
。大多数人发现后者更具可读性——前者是其他语言的遗留物。
顺便说一句,空集合是不好的。如果可能,请将其设为空集合。 See Effective Java: Item 43 - Return empty arrays or collections, not nulls.
@JonSkeet 人们使用 null == sampleMap 以防他们写 = 而不是 ==。如果你使用 sampleMap == null,当你忘记一个 = 时,它会变成 sampleMap = null,这不会引发错误,因此以另一种方式编写它有助于开发人员看到它
@UriLoya:如果你用 Java 写 if (null = sampleMap)
,你会得到一个编译错误。这正是我第一条评论的重点。它的“原因”是特定于语言的,但尽管存在可读性损失,但已经传播到其他语言,因为人们没有考虑为什么他们这样做。
您可以使用 org.apache.commons.collections4.CollectionUtils 包中的 CollectionUtils 类。有很多实用方法可以查找空或 null。
【参考方案1】:
如果您在项目中使用Apache Commons Collections 库,您可以使用CollectionUtils.isEmpty
和MapUtils.isEmpty()
方法分别检查集合或地图是否为empty 或null (即它们是“null-safe”)。
这些方法背后的代码或多或少是用户@icza 在他的回答中写的。
无论您做什么,请记住,您编写的代码越少,随着代码复杂性的降低,您需要测试的代码就越少。
【讨论】:
【参考方案2】:这是最好的检查方法。你可以编写一个辅助方法来做到这一点:
public static boolean isNullOrEmpty( final Collection< ? > c )
return c == null || c.isEmpty();
public static boolean isNullOrEmpty( final Map< ?, ? > m )
return m == null || m.isEmpty();
【讨论】:
Map<?>
也应该有类似的功能。
当然,您也可以为地图添加一个,但标题说明了收藏。
我不明白如果 m 为 null 那么 .isEmpty() 会导致 NullPointerException 吗?否则,如果左边 (m==null) 为真,则剩余部分不会被检查
@ismail ||
运算符是一个短路运算符,这意味着如果左操作数是true
,它不会计算右操作数。所以如果m == null
,那么m.isEmpty()
就不会被调用(不需要,结果是true
)。【参考方案3】:
如果您使用 Spring 框架,那么您可以使用 CollectionUtils
来检查集合(列表、数组)和映射等。
if(CollectionUtils.isEmpty(...)) ...
【讨论】:
也许,您说的是 MapUtils.isEmpty() 用于 Map,但不是用于所有 Collection?【参考方案4】:就我个人而言,我更喜欢使用空集合而不是 null
,并且让算法以某种方式工作,对于算法而言,集合是否为空并不重要。
【讨论】:
【参考方案5】:当你使用弹簧时,你可以使用
boolean isNullOrEmpty = org.springframework.util.ObjectUtils.isEmpty(obj);
其中 obj 是任意 [map,collection,array,aything...]
否则:代码为:
public static boolean isEmpty(Object[] array)
return (array == null || array.length == 0);
public static boolean isEmpty(Object obj)
if (obj == null)
return true;
if (obj.getClass().isArray())
return Array.getLength(obj) == 0;
if (obj instanceof CharSequence)
return ((CharSequence) obj).length() == 0;
if (obj instanceof Collection)
return ((Collection) obj).isEmpty();
if (obj instanceof Map)
return ((Map) obj).isEmpty();
// else
return false;
对于字符串最好的是:
boolean isNullOrEmpty = (str==null || str.trim().isEmpty());
【讨论】:
【参考方案6】:我们将检查 Collection 对象是否为空、是否为空。下面给出的所有方法都存在于 org.apache.commons.collections4.CollectionUtils 包中。
检查列表或设置集合对象的类型。
CollectionUtils.isEmpty(listObject);
CollectionUtils.isNotEmpty(listObject);
检查对象的地图类型。
MapUtils.isEmpty(mapObject);
MapUtils.isNotEmpty(mapObject);
所有方法的返回类型都是布尔值。
【讨论】:
CollectionUtils.isEmpty(listObject);这不适用于所有收藏。我已经尝试过设置,但它不起作用。 检查集合对象是否为空、是否为空的核心部分是collection == null || collection.isEmpty() 在内部所以你可以使用它。【参考方案7】:可以使用org.apache.commons.lang.Validate
的“notEmpty”方法:
Validate.notEmpty(myCollection)
-> 验证指定的参数集合既不是 null 也不是零大小(无元素);否则抛出异常。
【讨论】:
【参考方案8】:如果您需要检查 null,那就是这样。但是,如果您对此有控制权,请尽可能返回空集合,然后仅检查是否为空。
This thread 与 C# 大致相同,但原理同样适用于 java。就像那里提到的那样,只有在
null 可能意味着更具体的东西; 您的 API(合同)可能会强制您返回 null。
【讨论】:
【参考方案9】:对于包括地图在内的所有集合使用:isEmpty
方法,这些集合对象上存在。但是你必须先做一个空检查:
Map<String, String> map;
........
if(map!=null && !map.isEmpty())
......
【讨论】:
以上是关于在 Java 中验证 null 和空集合的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章