Есть ли способ избежать нулевой проверки до начала каждой итерации цикла?
Каждый раз, когда мне приходится перебирать коллекцию, я заканчиваю проверку нулевого значения, как раз перед началом итерации цикла for-each. Вот так:
if( list1 != null ){
for(Object obj : list1){
}
}
Есть ли более короткий способ, чтобы избежать записи блока if?
Примечание. Я использую Java 5 и на некоторое время застрял с ним.
Ответы
Ответ 1
Я предполагаю, что правильный ответ таков: нет способа сделать его короче. В комментариях есть некоторые методы, такие как те, но я не вижу, чтобы я их использовал. Я думаю, что лучше написать блок "if", чем использовать эти методы. и да... прежде, чем кто-нибудь еще об этом упоминает:) "В идеале" код должен быть указан таким образом, что список никогда не должен быть null
Ответ 2
Если возможно, вы должны создать свой код таким образом, чтобы коллекции не были null
в первую очередь.
null
коллекции - плохая практика (по этой причине); вместо этого вы должны использовать пустые коллекции. (например, Collections.emptyList()
)
В качестве альтернативы вы можете создать класс-оболочку, реализующий Iterable
, и берет коллекции и обрабатывает коллекцию null
.
Затем вы могли написать foreach(T obj : new Nullable<T>(list1))
Ответ 3
public <T extends Iterable> T nullGuard(T item) {
if (item == null) {
return Collections.EmptyList;
} else {
return item;
}
}
позволит вам написать
for (Object obj : nullGuard(list)) {
...
}
Конечно, это действительно просто усложняет ситуацию.
Ответ 4
Нулевая проверка в расширенном цикле
public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
return iterable == null ? Collections.<T>emptyList() : iterable;
}
Затем используйте:
for (Object object : emptyIfNull(someList)) { ... }
Ответ 5
Насколько короче вы хотите, чтобы это было? Это всего лишь дополнительные 2 строки И это ясная и лаконичная логика.
Я думаю, что более важно, что вам нужно решить, если null
является допустимым значением или нет. Если они недействительны, вы должны написать код, чтобы предотвратить его. Тогда вам не понадобится такая проверка. Если вы сделаете исключение при выполнении цикла foreach
, это признак того, что в вашем коде есть ошибка где-то еще.
Ответ 6
1), если list1 является членом класса, создайте список в конструкторе, чтобы он был там и не был пустым, но был пустым.
2) for (Object obj: list1!= null? list1: new ArrayList())
Ответ 7
В Java 8 есть еще одно решение, использующее java.util.Optional
и ifPresent
-метод.
Optional.ofNullable(list1).ifPresent(l -> l.forEach(item -> {/* do stuff */}));
Итак, это не решение для точной проблемы, но оно является oneliner и, возможно, более элегантным.
Ответ 8
Apache Commons
for (String code: ListUtils.emptyIfNull(codes)) {
}
Google Guava
for (String code: Optional.of(codes).get()) {
}
Ответ 9
Это уже 2017, и теперь вы можете использовать Apache Commons Collections4
Использование:
for(Object obj : CollectionUtils.emptyIfNull(list1)){
// Do your stuff
}