Google Guava isNullOrEmpty 用于集合
Posted
技术标签:
【中文标题】Google Guava isNullOrEmpty 用于集合【英文标题】:Google Guava isNullOrEmpty for collections 【发布时间】:2011-10-18 02:36:58 【问题描述】:我看到 Guava 有用于字符串的 isNullOrEmpty 实用方法
Strings.isNullOrEmpty(str)
我们有类似的列表吗?类似的东西
Lists.isNullOrEmpty(list)
应该等价于
list == null || list.isEmpty()
另外,我们有类似的数组吗?类似的东西
Arrays.isNullOrEmpty(arr)
应该等价于
arr == null || arr.length == 0
【问题讨论】:
【参考方案1】:不,这种方法在 Guava 中不存在,实际上在我们的“想法墓地”中。
我们不认为“为空或为空”是您真正想问的关于集合的问题。
如果一个集合可能为 null,并且 null 应该被视为空,那么请预先消除所有歧义,如下所示:
Set<Foo> foos = NaughtyClass.getFoos();
if (foos == null)
foos = ImmutableSet.of();
或者像这样(如果你喜欢的话):
Set<Foo> foos = MoreObjects.firstNonNull(
NaughtyClass.getFoos(), ImmutableSet.<Foo>of());
之后,您可以像往常一样使用.isEmpty()
。在调用顽皮的 API 时立即执行此操作,您已经将怪异抛诸脑后,而不是让它无限期地继续下去。
如果“真正意味着空集合的 null”没有返回给您,而是传递给您,那么您的工作很简单:只需抛出 NullPointerException
,然后让调用者成型。
【讨论】:
如果某个框架将它的字段设置为 null 并且您无法控制它(绑定到列表时的弹簧框架),尽管您在对象中明确设置并使用了空列表。 我的答案是一样的:尽快通过将null
标准化为空集合来消除歧义。如果你不能,那么好吧,你可能是真正想要编写自己的琐碎 isNullOrEmpty(Collection) 助手的
(或者跳过助手,在需要的情况下直接写if (collection == null || collection.isEmpty())
!有那么糟糕吗?)
这是一个固执己见的答案,实际上根本没有解决这个问题。这也违反了防御性编程原则。
@Neovibrant 因为问题是关于 Guava 库的功能,而答案来自 Guava 的主要开发人员之一,答案有点暗示:“不,Guava 没有那个”。不过,从那句话开始,答案可能会得到改善:)【参考方案2】:
你会在 Guava 中发现的一件事是,他们往往对 null
s 非常敌对。作者希望阻止您尽可能多地使用null
,并且提供实用方法以使其更易于使用null
会适得其反。
如果您想使用 Guava 的范例,请考虑此集合(或数组)的源是否真的应该可选地返回 null
。如果没有,请考虑将其标记为 @NonNull
并返回空集合而不是 null
。或者作为不期望 null
值列表的函数的参数,考虑使用 Preconditions.checkNotNull
,如果(意外)传入 null
,则会引发异常。
如果null
真的是合法的,list == null || list.isEmpty()
就没有那么难了。
【讨论】:
不一致。可以对 Strings 提出相同的论点,但是 is Strings.isNullOrEmpty()【参考方案3】:commons-collections 中有一个CollectionUtils.isEmpty()。
【讨论】:
不幸的是,它似乎已在更新的版本中被删除。请参阅 org.apache.commons.collections15.CollectionUtils。 查看来自 apache.commons.collection 的 Javadoc 方法 isEmpty() 和 isNotEmpty() 仍然存在于最新版本中。 collections15.CollectionUtils 似乎是一个试图提供通用支持的独立项目。 CollectionUtils.isEmpty() 在处理遗留应用程序时非常有用,因为您无法更改预先代码。 我们知道这一点,但有人问的是番石榴而不是 apache commons。【参考方案4】:Spring Framework 有专门的 util 类,称为 CollectionUtils
。您正在寻找的方法是:org.springframework.util.CollectionUtils.isEmpty
。它为 null 和空集合返回 true。
对于数组,org.springframework.util.ObjectUtils.isEmpty
方法的行为几乎相同。
【讨论】:
虽然使用它可能是安全的,但是这个类被标记为“主要供框架内部使用”注释。这意味着它的界面可能会在 Spring 升级时发生变化,你必须做额外的工作才能让它再次工作。【参考方案5】:Apache CollectionUtils 4 有一个方法CollectionUtils.emptyIfNull(),如果集合为空,则返回一个空列表。这在 foreach 循环中非常有用,因此您无需在迭代之前进行 null 检查
【讨论】:
【参考方案6】:我的解决方案是:MoreObjects.firstNonNull(list, Collections.emptyList())
我将 Guava MoreObjects 与 JDK 集合一起使用。
@Test
public void listnull()
List<String> list = null;
for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList()))
System.out.println(str);
list = new ArrayList<String>();
list.add("http://***.com/");
for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList()))
System.out.println(str);
【讨论】:
这正是top answer 中建议的内容,但您不使用ImmutableList
。
我认为是否定的,因为人们想要简单快捷的解决方案,例如 apache commons 方法 inNotEmpty ...
帮助中心 > 特权 > 否决 我应该何时投反对票?每当您遇到一个非常草率、不费吹灰之力的帖子,或者一个明显不正确且可能非常不正确的答案时,请使用您的反对票。你每天的投票数量是有限的,而且回答否决票会让你失去一点声誉;明智地使用它们。***.com/help/privileges/vote-down
您认为我的回答是“极其草率、不费吹灰之力的帖子,还是一个明显不正确且可能非常不正确的答案”?如果不是,你为什么要投反对票?【参考方案7】:
查看 Appache 集合 CollectionUtils.isEmpty() 如果集合为空或为空,则返回 true
【讨论】:
以上是关于Google Guava isNullOrEmpty 用于集合的主要内容,如果未能解决你的问题,请参考以下文章