ArrayList.addAll的任何null安全替代?

ZeD*_*ino 24 java collections arraylist

我正在重构我编写的一些旧代码,并且我在这段代码上做了标记:

    List<OcmImageData> fullImagePool = new ArrayList<>();
    if (CollectionUtils.isNotEmpty(style.getTestMH())) {
        fullImagePool.addAll(style.getTestMH());
    }
    if (CollectionUtils.isNotEmpty(style.getTrousers())) {
        fullImagePool.addAll(style.getTrousers());
    }
    if (CollectionUtils.isNotEmpty(style.getDetailRevers())) {
        fullImagePool.addAll(style.getDetailRevers());
    }
    if (CollectionUtils.isNotEmpty(style.getDetailCuffs())) {
        fullImagePool.addAll(style.getDetailCuffs());
    }
    if (CollectionUtils.isNotEmpty(style.getDetailInner())) {
        fullImagePool.addAll(style.getDetailInner());
    }
    if (CollectionUtils.isNotEmpty(style.getDetailMaterial())) {
        fullImagePool.addAll(style.getDetailMaterial());
    }
    if (CollectionUtils.isNotEmpty(style.getComposing())) {
        fullImagePool.addAll(style.getComposing());
    }
    ...
Run Code Online (Sandbox Code Playgroud)

所以基本上我需要创建一个ArrayList,其中包含这里引用的所有列表,因为它们可以为null(它们是从一个封闭的源代码框架中提取出来的数据库,不幸的是如果他没有找到任何东西它就是null),我需要每次检查集合是否为null时将它们添加到此池中,这看起来很奇怪.

是否有库或Collection-Framework实用程序类,使我能够在不执行空安全检查的情况下将集合添加到另一个集合中?

Yas*_*shu 45

在Java 8中使用以下代码: -

Optional.ofNullable(listToBeAdded).ifPresent(listToBeAddedTo::addAll)
Run Code Online (Sandbox Code Playgroud)

listToBeAdded - 要添加元素的列表.listToBeAddedTo - 使用addAll向其添加元素的列表.

  • 这比 OP 的代码更简洁,它可以放在一行中,它只使用现有的 Java 功能(并且与实用函数解决方案一样具有可读性)。我不认为这是一个“丑陋”的解决方案。如果每个列表为空,则将每个列表设为空会更难看,除非您将其包装到执行整个替换的自定义 List 类中(这有缺点并且实现起来更繁重)。我会说最好/更清洁的解决方案取决于你需要多久做一次这样的事情,但我认为这个值得一票。 (5认同)
  • 这太丑了。如果`listToBeAdded` 为空,我将把它设置为一个空列表。 (2认同)

Jes*_*per 27

只需编写一个小实用程序方法:

public static <E> void addAllIfNotNull(List<E> list, Collection<? extends E> c) {
    if (c != null) {
        list.addAll(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以写:

List<OcmImageData> fullImagePool = new ArrayList<>();
addAllIfNotNull(fullImagePool, style.getTestMH());
addAllIfNotNull(fullImagePool, style.getTrousers());
addAllIfNotNull(fullImagePool, style.getDetailRevers());
// ...etc
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个概念并且赞成,但是这似乎对我来说太具体了。我会写一个更通用的工具,`convertNullToEmpty(Collection inMightBeNull)`;(为简单起见,省略了泛型,因为这是注释)。然后使用fullImagePool.addAll(convertNullToEmpty(style.getXXX()));` (3认同)

Jea*_*art 9

使用Java 8:

List<OcmImageData> fullImagePool = Stream.of(style.getTestMH(), /* etc */)
                                         .filter(Objects::nonNull)
                                         .flatMap(l -> l.stream())
                                         .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


dje*_*lin 6

这个重构干净利落

for (OcmImageData elem : new List<OcmImageData>[] { style.getTestMH(), style.getTrousers() /* etc */}) {
    if (CollectionUtils.isNotEmpty(elem)) {
        fullImagePull.addAll(elem);
    }
}
Run Code Online (Sandbox Code Playgroud)

要回答你原来的问题,不,你必须做自己的空检查.您可以看到Guava的方法将抛出NPE,Apache的方法明确要求输入不为null.