Google Guava isNullOrEmpty的集合


102

我看到番石榴对字符串有isNullOrEmpty实用程序方法

Strings.isNullOrEmpty(str)

列表是否有类似内容?就像是

Lists.isNullOrEmpty(list)

应该等于

list == null || list.isEmpty()

另外,我们对数组有类似的东西吗?就像是

Arrays.isNullOrEmpty(arr)

应该等于

arr == null || arr.length == 0

Answers:


141

不,这种方法在番石榴中不存在,实际上在我们的“理想墓地”中。

我们不认为“ null或null”是您真正想询问的关于集合的问题。

如果一个集合可能为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时立即执行此操作,您已经将怪异现象抛在身后,而不是让它无限期地继续下去。

而且,如果“空值实际上意味着空集合”没有返回给您,而是传递给了您,那么您的工作就很容易:只要丢掉一个NullPointerException,然后使调用者整形即可。


7
如果某些框架将其字段设置为null并且您无法控制它(绑定到列表时为spring框架),尽管您在对象中明确设置并使用了空列表该怎么办。
OMax 2012年

15
我的答案是相同的:尝试通过null尽快标准化为空集合来消除歧义。如果不能,那么,您可能是真正要编写自己的琐碎isNullOrEmpty(Collection)帮助器的用户中,不到1%的人之一。
凯文·布劳里恩

8
(或跳过帮助程序,仅if (collection == null || collection.isEmpty())在需要的情况下写!这太糟糕了吗?)
Kevin Bourrillion

13
这是一个自以为是的答案,实际上根本没有解决这个问题。这也违反了防御性编程原则。
13年

11
@Neovibrant,因为问题是关于Guava库的功能的,而答案是来自Guava的首席开发人员之一,因此答案暗示:“不,Guava没有。” 可以通过从以下语句开始来改善答案:)
Grundlefleck 2013年

37

您可能会在整个番石榴中发现一件事,即它们往往对nulls 非常不利。作者希望阻止您null尽可能多地使用它,并且提供实用的方法以使其更易于使用null将适得其反。

如果要使用Guava的范例,请考虑该集合(或数组)的源是否真的应该有选择地返回null。如果不是,请考虑对其进行标记,@NonNull然后返回空集合而不是null。或将其用作期望无null值列表的函数的参数,请考虑使用Preconditions.checkNotNull,如果null(意外地)传入a,则会引发异常。

如果null真的合法,list == null || list.isEmpty()那就不难了。


9
这是不一致的。同样的道理也可以用于字符串进行,但有一个Strings.isNullOrEmpty()
唐·钱德尔

29

commons-collections中有一个CollectionUtils.isEmpty()


1
不幸的是,它似乎已在最新版本中删除。参见org.apache.commons.collections15.CollectionUtils。
spaaarky21

1
从apache.commons.collection查看Javadoc,方法isEmpty()和isNotEmpty()在最新版本中仍然存在。collections15.CollectionUtils似乎是一个独立的项目,试图提供通用支持。
proko 2012年

1
当您无法更改前端代码时,CollectionUtils.isEmpty()在处理旧版应用程序时很有用。
Jerome Dalbert

1
我们知道这一点,但是有人问的是番石榴,而不是关于Apache Commons。
到Kra 2015年

9

Spring Framework具有称为的专门util类CollectionUtils。您正在寻找的方法是:org.springframework.util.CollectionUtils.isEmpty。对于null和空集合,它返回true。

对于数组,有一种org.springframework.util.ObjectUtils.isEmpty方法的行为几乎相同。


5
尽管使用它可能是安全的,但该类已标记为“主要供框架内部使用”注释。这意味着在Spring升级时其界面可能会更改,您将不得不做其他工作才能使其再次运行。
Mike Minicki 2013年

2

Apache CollectionUtils 4具有CollectionUtils.emptyIfNull()方法,如果该集合为null,则该方法返回一个空列表。这在foreach循环中非常有用,因此您不需要在进行迭代之前执行null检查


1

我的解决方案是:MoreObjects.firstNonNull(list,Collections。emptyList())

我正在使用带有JDK集合的Guava MoreObjects。

 @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://stackoverflow.com/");

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}
}

1
这就是最佳答案中的建议,除非您不使用ImmutableList
dimo414

我认为这是负面的,因为有人想要简单快捷的解决方案,例如inNotEmpty中的apache commons方法...
到Kra

帮助中心>特权>否决我什么时候应该否决?每当遇到过分草率,不费力气的帖子,或者答案显然是错误的,甚至是危险的错误答案时,请使用下注。您每天的选票数量有限,此外,低票数投票还使您的名誉受损;明智地使用它们。stackoverflow.com/help/privileges/vote-down
jeton

您是否认为我的答案是“草率的,毫不费力的帖子,或者是明显且可能是危险的错误答案”?如果没有,您为什么要投反对票?
杰顿2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.