it-swarm.com.ru

Есть ли способ избежать проверки на ноль перед началом итерации цикла for-each?

Каждый раз, когда мне приходится перебирать коллекцию, я заканчиваю проверку на нулевое значение, как раз перед началом итерации цикла for-each. Как это:

if( list1 != null ){
    for(Object obj : list1){

    }
}

Есть ли более короткий путь, чтобы мы могли избежать записи блока if? Примечание. Я использую Java 5 и на некоторое время застряну с ним.

101
rk2010

Я думаю, правильный ответ таков: нет способа сделать его короче. Есть некоторые методы, такие как те в комментариях, но я не вижу себя использующим их. Я думаю, что лучше написать блок "если", чем использовать эти методы. и да .. прежде чем кто-нибудь еще упомянет об этом :) "в идеале" код должен быть разработан таким образом, чтобы список никогда не был null

32
rk2010

Если возможно, вы должны разработать свой код так, чтобы коллекции не были null в первую очередь.

Коллекции null - плохая практика (по этой причине); вы должны использовать пустые коллекции вместо этого. (например, Collections.emptyList() )

В качестве альтернативы, вы можете создать класс-оболочку, который реализует Iterable и принимает коллекции, а также обрабатывает коллекцию null.
Вы можете написать foreach(T obj : new Nullable<T>(list1))

77
SLaks
public <T extends Iterable> T nullGuard(T item) {
  if (item == null) {
    return Collections.EmptyList;
  } else {
    return item;
  }
}

позволит вам написать

for (Object obj : nullGuard(list)) {
  ...
}

Конечно, это действительно просто перемещает сложность в другом месте.

39
Edwin Buck

Уже 2017 год, и теперь вы можете использовать Apache Commons Collections4

Использование:

for(Object obj : CollectionUtils.emptyIfNull(list1)){
    // Do your stuff
}
17
Fred Pym

В Java 8 есть другое решение, доступное с использованием Java.util.Optional и метода ifPresent-.

Optional.ofNullable(list1).ifPresent(l -> l.forEach(item -> {/* do stuff */}));

Таким образом, не решение для точной проблемы, но это единственное и, возможно, более элегантный.

16
wassgren

проверка нуля в расширенном цикле for

public static <T> Iterable<T> emptyIfNull(Iterable<T> iterable) {
    return iterable == null ? Collections.<T>emptyList() : iterable;
}

Тогда используйте:

for (Object object : emptyIfNull(someList)) { ... }
11
gavenkoa

Apache Commons

for (String code: ListUtils.emptyIfNull(codes)) {

}           

Google Guava

for (String code: Optional.of(codes).get()) {

}
9
Kerem Baydoğan

Насколько короче вы хотите, чтобы это было? Это только лишние 2 строки И это понятная и лаконичная логика.

Я думаю, что более важная вещь, которую вам нужно решить, - это допустимое значение null или нет. Если они недействительны, вы должны написать свой код, чтобы предотвратить это. Тогда вам не понадобится такая проверка. Если вы получаете исключение при выполнении цикла foreach, это признак того, что где-то в вашем коде есть ошибка.

7
unholysampler

1) если list1 является членом класса, создайте список в конструкторе, чтобы он был и не был нулевым, хотя и пустым.

2) for (Объект obj: list1! = Null? List1: new ArrayList ())

5
Chris