【问题标题】:Is there a JDK or Guava method to turn a null into an empty list?是否有 JDK 或 Guava 方法可以将 null 转换为空列表?
【发布时间】:2013-01-31 22:48:53
【问题描述】:

在JDK或者Google Guava中是否有这样的方法

public static <T> Collection<T> safe(Collection<T> collection) {
    if (collection == null) {
        return new ArrayList<>(0);
    } else {
        return collection;
    }
}

例如,如果某些内容返回空列表,则可以很容易地在增强的循环中不崩溃

for (String string : CollectionUtils.safe(foo.canReturnANullListOfStrings())) {
    // do something
}

不会崩溃。

我环顾四周,但找不到任何这样的方法,我想知道我是否错过了它,或者是否有原因导致这种方便的方法不方便因此不包括在内?

【问题讨论】:

  • 方法首先不应返回null 集合。
  • 我相信使用Collections.emptyList()可以轻松编写这样的方法。
  • @SLaks 原则上同意但你不能控制其他人的代码:)
  • 使用 AspectJ 和 after-advice 来保护自己免受返回 null 而不是空的 Collection 的代码影响的一种有点令人困惑的方法。创建一个切入点来匹配返回Collection 的方法的执行,如果原始返回值为null,则返回一个空的Collection。对 MapList 等重复此操作。但是,您的同事可能不喜欢这一点。

标签: java collections guava


【解决方案1】:
Objects.firstNonNull(list, ImmutableList.<Foo>of());

不需要专门的方法,并且我们建议您在从一个理想情况下一开始就不应该这样做的顽皮 API 获得可能为空的集合时立即使用这个 is indeed 解决方案。

【讨论】:

  • 多么让简单的任务看起来复杂的方法啊。从下面的评论中使用 apache 集合 ListUtils.emptyIfNull。读起来更好。
  • 这正是人们取笑 Java 的原因。其他人给出的解决方案更具可读性。
【解决方案2】:

Apache Collections 4 有一个通用方法ListUtils.emptyIfNull(List&lt;T&gt; list)

这里是文档:https://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/ListUtils.html

【讨论】:

  • 最佳非 java 8 解决方案。
【解决方案3】:

在 Java 8 中可以这样使用:

Optional.ofNullable(foo.canReturnANullListOfStrings()).orElse(Collections.emptyList());

【讨论】:

    【解决方案4】:

    Java 9 更新: java.util.Objects.requireNonNullElse(collection, List.<T>of())

    &lt;T&gt; 仍然是必需的。

    【讨论】:

      【解决方案5】:

      因此,据我所知,不存在此类功能。但是,正如您在上面显示的那样,编写一个是微不足道的。为什么它可能未被包含在内的原因是因为null 具有特定含义,并且在传递时返回空的Collection 可能不合适。通常(根据我的经验)当一个空值进入系统时,链上的某些东西会失败,或者无效值没有得到适当的清理。

      【讨论】:

      • 不幸的是,我经常在生成的包装中看到它,例如一些 JSON。如果没有这种方法,像for(String thing : someObjFromJson.getFoo().getBar().getListOfThings()) {...do stuff...} 这样的构造就变得不简单了。
      猜你喜欢
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多