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 中发现的一件事是,他们往往对 nulls 非常敌对。作者希望阻止您尽可能多地使用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 用于集合的主要内容,如果未能解决你的问题,请参考以下文章

初探Google Guava

Guava学习笔记:Google Guava 类库简介

Google Guava 基本工具

Google线程框架com.google.guava

google Guava 快速入门

使用google guava做内存缓存