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?
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.
É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
Utilisation de Java 8:
List<OcmImageData> fullImagePool = Stream.of(style.getTestMH(), /* etc */)
.filter(Objects::nonNull)
.flatMap(l -> l.stream())
.collect(Collectors.toList());
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 .