Есть ли способ избежать нулевой проверки до начала каждой итерации цикла?

Каждый раз, когда мне приходится перебирать коллекцию, я заканчиваю проверку нулевого значения, как раз перед началом итерации цикла 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)) {
  ...
}

Конечно, это действительно просто усложняет ситуацию.

Ответ 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
}