Любая нулевая безопасная альтернатива ArrayList.addAll?
Я рефакторинг старого кода, который я написал, и я наткнулся на этот код:
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, чтобы добавить их в этот пул, который выглядит просто странно.
Есть ли библиотека или класс утилиты Collection-Framework, которая дает мне возможность добавить коллекцию в другую, не выполняя нуль-безопасную проверку?
Ответы
Ответ 1
Просто напишите небольшой полезный метод:
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
В Java 8 Используйте код ниже: -
Optional.ofNullable(listToBeAdded).ifPresent(listToBeAddedTo::addAll)
listToBeAdded - список, элементы которого должны быть добавлены.
listToBeAddedTo - список, в который вы добавляете элементы с помощью addAll.
Ответ 3
Использование Java 8:
List<OcmImageData> fullImagePool = Stream.of(style.getTestMH(), /* etc */)
.filter(Objects::nonNull)
.flatMap(l -> l.stream())
.collect(Collectors.toList());
Ответ 4
Это реорганизует чисто
for (OcmImageData elem : new List<OcmImageData>[] { style.getTestMH(), style.getTrousers() /* etc */}) {
if (CollectionUtils.isNotEmpty(elem)) {
fullImagePull.addAll(elem);
}
}
Чтобы ответить на ваш первоначальный вопрос, нет, вам придется выполнить свою нулевую проверку. Вы можете видеть методы Guava будут бросать NPE, а методы Apache явно требуют ввод не должен быть нулевым.