while visual for ejemplos ciclo bucle array for-loop foreach java-5

for loop - visual - ¿Hay alguna manera de evitar la comprobación nula antes de que comience la iteración del bucle for-each?



ejemplos de for each en visual basic (9)

Cada vez que tengo que iterar sobre una colección, termino comprobando nulo, justo antes de que comience la iteración del bucle for-each. Me gusta esto:

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

¿Hay un camino más corto para que podamos evitar escribir el bloque "si"? Nota: Estoy usando Java 5 y me quedaré atascado por algún tiempo.


¿Cuánto más corto quieres que sea? Es solo un extra de 2 líneas Y es una lógica clara y concisa.

Creo que lo más importante que debe decidir es si null es un valor válido o no. Si no son válidos, debe escribir su código para evitar que suceda. Entonces no necesitarías este tipo de control. Si obtiene una excepción mientras hace un bucle foreach , eso es una señal de que hay un error en otro lugar en su código.


1) si list1 es miembro de una clase, crea la lista en el constructor para que esté allí y no nulo, aunque esté vacía.

2) para (Object obj: list1! = Null? List1: new ArrayList ())


Apache Commons

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

Google Guava

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


En Java 8 hay otra solución disponible utilizando java.util.Optional y ifPresent .

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

Por lo tanto, no es una solución para el problema exacto, pero es un oneliner y posiblemente más elegante.


Si es posible, debe diseñar su código de manera que las colecciones no sean null en primer lugar.

null colecciones null son malas prácticas (por esta razón); deberías usar colecciones vacías en su lugar. (por ejemplo, Collections.emptyList() )

Alternativamente, podría crear una clase contenedora que implemente Iterable y tome una colección, y maneje una colección null .
Luego podría escribir foreach(T obj : new Nullable<T>(list1))


Supongo que la respuesta correcta es que no hay forma de acortarlo. Hay algunas técnicas, como las de los comentarios, pero no me veo a mí mismo usándolas. Creo que es mejor escribir un bloque "si" que usar esas técnicas. y sí ... antes de que alguien lo mencione una vez más :) "idealmente" el código debe ser diseñado de tal manera que la lista nunca sea nula


Ya es 2017, y ahora puedes usar Apache Commons Collections4

El uso:

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


Verificación nula en un bucle forzado mejorado

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

Luego usa:

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


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

te permitiría escribir

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

Por supuesto, esto realmente solo mueve la complejidad a otro lado.