Google Guava isNullOrEmpty用于收藏

Ram*_*esh 101 java guava

我看到Guava有针对字符串的isNullOrEmpty实用方法

Strings.isNullOrEmpty(str)
Run Code Online (Sandbox Code Playgroud)

我们对列表有什么相似之处吗?就像是

Lists.isNullOrEmpty(list)
Run Code Online (Sandbox Code Playgroud)

这相当于

list == null || list.isEmpty()
Run Code Online (Sandbox Code Playgroud)

另外,我们对阵列有什么相似之处吗?就像是

Arrays.isNullOrEmpty(arr)
Run Code Online (Sandbox Code Playgroud)

这相当于

arr == null || arr.length == 0
Run Code Online (Sandbox Code Playgroud)

Kev*_*ion 141

不,这种方法在番石榴中不存在,实际上在我们的"思想墓地"中.

我们不相信"空或空"是一个你真正想要询问集合的问题.

如果一个集合可能为null,并且null应该被视为空,那么就预先解决所有这些歧义,如下所示:

Set<Foo> foos = NaughtyClass.getFoos();
if (foos == null) {
  foos = ImmutableSet.of();
}
Run Code Online (Sandbox Code Playgroud)

或者像这样(如果你愿意):

Set<Foo> foos = MoreObjects.firstNonNull(
    NaughtyClass.getFoos(), ImmutableSet.<Foo>of());
Run Code Online (Sandbox Code Playgroud)

在那之后,你可以像平常一样使用.isEmpty().在调用淘气的API时立即执行此操作,并且您已经将这种奇怪的东西放在身后,而不是让它无限期地继续下去.

如果"null真正意味着空集"并没有归还给你,而是传递给你,那么你的工作很简单:只需NullPointerException抛出一个,然后让调用者变形.

  • 我的答案是一样的:尽可能通过将`null`标准化为空集合来消除歧义.如果你不能,那么没关系,你可能是<1%的用户真正想要写自己的琐碎的isNullOrEmpty(Collection)助手. (15认同)
  • 这是一个固执己见的答案,根本没有解决这个问题.它也违背了防御性编程原则. (12认同)
  • @Neovibrant因为问题是关于Guava库的功能,答案来自Guava的主要开发者之一,答案有点暗示:"不,Guava没有那个".尽管可以从那个语句开始改进答案:) (11认同)
  • (或者跳过帮助器,只需要在需要它的情况下编写`if(collection == null || collection.isEmpty())`这样那么糟糕吗?) (8认同)
  • 如果某个框架将其字段设置为null并且您无法控制它(绑定到列表时的弹簧框架),尽管您在对象中显式设置并使用空列表,该怎么办? (7认同)
  • 另外,对于null字符串,不能使用完全相同的参数吗?为什么要创建Strings.isNullOrEmpty()而不是集合.当量? (6认同)
  • @Grundlefleck好的,做到了. (4认同)
  • 如果Guava添加了Lists.nullToEmpty()方法以保持一致性,那就太棒了. (2认同)

Ray*_*Ray 37

在整个番石榴中你会发现的一件事是它们往往对nulls 非常反对.作者希望阻止您null尽可能多地使用,并提供实用方法以使其更容易使用null将对此目的起反作用.

如果你想使用Guava的范例,请考虑这个集合(或数组)的来源是否真的应该选择返回null.如果没有,请考虑标记它@NonNull并返回空集合而不是null.或者作为期望无null值列表的函数的参数,考虑使用Preconditions.checkNotNull,如果a null(意外地)传入则抛出异常.

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

  • 这是不一致的.可以对字符串进行相同的论证,但是*是*一个字符串.isNullOrEmpty() (9认同)

Ste*_*ker 29

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


Luk*_*asz 9

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

对于数组,有一种org.springframework.util.ObjectUtils.isEmpty方法表现得非常相似.

  • 虽然使用它可能是安全的,但这个类标有"主要用于框架内部使用"的注释.这意味着它的界面可能会在Spring升级时发生变化,您将不得不进行额外的工作以使其再次运行. (5认同)