【问题标题】:Google Guava isNullOrEmpty for collectionsGoogle Guava isNullOrEmpty 用于集合
【发布时间】: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

【问题讨论】:

    标签: java guava


    【解决方案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://stackoverflow.com/");
      
      for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
          System.out.println(str);
      }
      }
      

      【讨论】:

      • 这正是top answer 中建议的内容,但您不使用ImmutableList
      • 我认为是否定的,因为人们想要简单快捷的解决方案,例如 apache commons 方法 inNotEmpty ...
      • 帮助中心 > 特权 > 否决 我应该何时投反对票?每当您遇到一个非常草率、不费吹灰之力的帖子,或者一个明显不正确且可能非常不正确的答案时,请使用您的反对票。你每天的投票数量是有限的,而且回答否决票会让你失去一点声誉;明智地使用它们。stackoverflow.com/help/privileges/vote-down
      • 您认为我的回答是“极其草率、不费吹灰之力的帖子,还是一个明显不正确且可能非常不正确的答案”?如果不是,你为什么要投反对票?
      【解决方案7】:

      查看 Appache 集合 CollectionUtils.isEmpty() 如果集合为空或为空,则返回 true

      【讨论】:

        猜你喜欢
        • 2013-10-10
        • 1970-01-01
        • 2012-10-22
        • 2015-11-01
        • 1970-01-01
        • 2015-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多