Каков наилучший способ защиты от нуля в цикле for в Java?
Это выглядит некрасиво
if (someList != null) {
for (Object object : someList) {
// do whatever
}
}
Или
if (someList == null) {
return; // Or throw ex
}
for (Object object : someList) {
// do whatever
}
Там не может быть никакого другого пути. Должны ли они поместить его в for
саму конструкцию, если он нулевой, то не запускать цикл?
null
это не то же самое, что пустая коллекция.Ответы:
Вам лучше проверить, откуда вы получили этот список.
Пустой список - это все, что вам нужно, потому что пустой список не подведет.
Если вы получили этот список откуда-то еще и не знаете, нормально ли это, вы можете создать служебный метод и использовать его следующим образом:
И конечно
safe
будет:источник
emptyList
java.sun.com/j2se/1.5.0/docs/api/java/util/… Что такое IIRC?Вы могли бы потенциально написать вспомогательный метод, который возвращал бы пустую последовательность, если вы передали значение null:
Тогда используйте:
Я не думаю, что на самом деле сделал бы это - я бы обычно использовал вашу вторую форму. В частности, важно «или throw ex» - если оно действительно не должно быть нулевым, вы должны обязательно выбросить исключение. Вы знаете, что что- то пошло не так, но вы не знаете масштаб ущерба. Прервать рано.
источник
emptyIfNull
являетсяIterable<T>
- есть несчастныйremove
метод наIterator<T>
, но это единственный изменяемый аспект его (? И если у вас есть пустая коллекция, почему вы пытаетесь удалить что - нибудь из него) Это не ясно , что вы» Возражаю здесь.Уже 2017 год, и теперь вы можете использовать Apache Commons Collections4
Использование:
Вы можете сделать ту же проверку на нулевую безопасность для других классов Collection с помощью
CollectionUtils.emptyIfNull
.источник
Collections.emptyList()
внутренне, что в свою очередь всегда возвращает один и тот же предварительно выделенный пустой неизменяемый список.С Java 8
Optional
:источник
someList != null ? someList : Collections.emptyList()
а также создает и немедленно выбрасывает экземплярOptional
объекта.Использовать
ArrayUtils.nullToEmpty
изcommons-lang
библиотеки для массивовЭта функциональность существует в
commons-lang
библиотеке, которая включена в большинство проектов Java.Это то же самое, что ответ @OscarRyz, но ради СУХОЙ мантры, я думаю, это стоит отметить. См. Страницу проекта « Общие достояния ». Вот документация по
nullToEmpty
API и источникMaven запись для включения
commons-lang
в ваш проект, если это еще не сделано.К сожалению,
commons-lang
не предоставляет эту функциональность дляList
типов. В этом случае вам придется использовать вспомогательный метод, как упоминалось ранее.источник
Если вы получаете это
List
из вызова метода, который вы реализуете, то не возвращайтеnull
, возвращайте пустойList
.Если вы не можете изменить реализацию, то вы застряли с
null
проверкой. Если это не должно бытьnull
, тогда бросьте исключение.Я бы не стал использовать вспомогательный метод, который возвращает пустой список, потому что он может быть полезен несколько раз, но тогда вы привыкнете вызывать его в каждом цикле, который вы делаете, возможно, скрывая некоторые ошибки.
источник
Я изменил приведенный выше ответ, поэтому вам не нужно приводить из объекта
а затем просто вызвать список по
Объяснение: MyOwnObject: Если
List<Integer>
тогда MyOwnObject будет Integer в этом случае.источник
Еще один способ эффективно защититься от нуля в цикле for - это обернуть вашу коллекцию с помощью Google Guava.
Optional<T>
поскольку это, как мы надеемся, делает ясной возможность фактически пустой коллекции, поскольку ожидается, что клиент будет проверять, присутствует ли коллекция вOptional.isPresent()
.источник
Для тех, кто не заинтересован в написании своего собственного статического нулевого метода безопасности, вы можете использовать: commons-lang's
org.apache.commons.lang.ObjectUtils.defaultIfNull(Object, Object)
. Например:ObjectUtils.defaultIfNull JavaDoc
источник
Используйте
CollectionUtils.isEmpty(Collection coll)
метод, который является Null-safe, проверяет, является ли указанная коллекция пустой.для этого
import org.apache.commons.collections.CollectionUtils
.Maven зависимость
источник
источник