Any null safe alternative to ArrayList.addAll?

78k views Asked by At

I was refactoring some old code of mine that I've written and I stumbeled on this code:

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

So basically I need to create an ArrayList which contains all Lists here referenced, because those can be null (they are fetched out of the database from an closed sourced framework, and unfortunately its null if he doesn't find anything), I need to check everytime if the collection is not null to add them into this pool which looks just weird.

Is there a library or Collection-Framework utility class that gives me the posibility to add a collection to another without performing the null-safe check?

4

There are 4 answers

7
djechlin On

This refactors cleanly to

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

To answer your original question, no, you will have to do your own null check. You can see Guava's methods will throw an NPE, and Apache's methods explicitly require the input to be not null.

3
Jesper On

Just write a small utility method:

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

so that you can write:

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

Using Java 8:

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

In Java 8 Use below code:-

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

listToBeAdded - The list whose elements are to be added. listToBeAddedTo - The list to which you are adding elements using addAll.