web-dev-qa-db-fra.com

Une alternative nulle et sûre à ArrayList.addAll?

Je refactorisais un vieux code que j'ai écrit et je suis tombé sur ce 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());
    }
    ...

Donc, fondamentalement, je dois créer un ArrayList qui contient toutes les listes référencées ici, car celles-ci peuvent être nulles (elles sont extraites de la base de données à partir d'un cadre source fermé, et malheureusement, sa valeur nulle s'il ne trouve rien), je dois vérifiez à chaque fois si la collection n'est pas nulle pour les ajouter dans ce pool qui a l'air juste bizarre.

Existe-t-il une bibliothèque ou une classe d'utilitaires Collection-Framework qui me donne la possibilité d'ajouter une collection à une autre sans effectuer la vérification null-safe?

22
ZeDonDino

Dans Java 8 Utilisez le code ci-dessous: -

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

listToBeAdded - La liste dont les éléments doivent être ajoutés. listToBeAddedTo - La liste à laquelle vous ajoutez des éléments à l'aide de addAll.

39
Yashu

Écrivez simplement une petite méthode utilitaire:

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

afin que vous puissiez écrire:

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

Utilisation de Java 8:

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

Cette refacteurs proprement

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

Pour répondre à votre question d'origine, non, vous devrez faire votre propre vérification nulle. Vous pouvez voir les méthodes de Guava lèveront un NPE , et les méthodes d'Apache nécessitent explicitement que l'entrée ne soit pas nulle .

6
djechlin