空安全的集合包含方法

14

什么是在Java集合上进行null-safe的最佳contains的方法?

换句话说 -

 if (collection != null && collection.contains(x))

我希望 Apache commons-collections 有类似于 CollectionUtils.contains(collection, x) 的功能,如果集合为空就返回 false,就像 size() 一样把 null 视为空集合。

然而,看起来并没有这样的功能——我错过了吗?


5
collection != null && collection.contains(x) 的问题在哪里?简单且无外部依赖! - Abhinav Sarkar
1
@AbhinavSarkar:这就是我所想的! - Cratylus
这里有一个相关的帖子,是由一个不想一直检查 null 的人发布的:https://dev59.com/AHVC5IYBdhLWcg3whBaj - RonaldBarzell
请注意,如果 x 为空,则存在更大的问题。即使您已经检查了 collection 不为空,但某些类型的集合(例如没有自己的 ComparatorTreeSet)会导致 collection.contains(null) 抛出 NullPointerException,而您真正希望它只是返回 false。我仍在寻找一种空安全的方法来执行 collection.contains(x),而不需要显式捕获此异常。 - Dawood ibn Kareem
2个回答

11

在这里,您应该使用空对象模式并使用空集合,而不是空集合。当然,也许这对于您的问题是适当的,但是如果没有更多的上下文,很难确定。换句话说,我认为您正在解决错误的问题--为什么收集首先会是空的?


总的来说,我同意。具体问题是集合来自session.getAttribute,因此可能从未设置过。因此,至少需要进行一个非空检查-但如果有多个这样的检查,是的,我可以只进行一次检查并替换为空集合。 - wrschneider
在这种情况下,也许考虑使用Guava的Optional呢?问题是这仍然需要检查Optional.isPresent()。我认为这基本上是不可避免的。 - Thorn G

1

像这样做:

CollectionUtils.emptyIfNull(collection).contains(x)

对于SetUtilsMapUtilsListUtils等,也有相应的版本。

这段代码比较长,因此我认为它主要在需要Lambda的单个表达式时非常有用。


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