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

时间:2015-06-09 17:40:00

标签: java arraylist collections

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

    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());
    }
    ...

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

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

4 个答案:

答案 0 :(得分:33)

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

Optional.ofNullable(listToBeAdded).ifPresent(listToBeAddedTo::addAll)

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

答案 1 :(得分:24)

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

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

这样你就可以写:

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

答案 2 :(得分:9)

使用Java 8:

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

答案 3 :(得分:6)

这个重构干净利落于

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

要回答原来的问题,不,你必须自己做空检查。您可以看到Guava's methods will throw an NPE和Apache的方法explicitly require the input to be not null