Cada vez que tengo para iterar sobre una colección que acaban de comprobar null, justo antes de la iteración de la para cada bucle se inicia. Como este:

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

    }
}

Hay un camino más corto, por lo que podemos evitar escribir el «si» bloque ?
Nota: estoy usando Java 5, y se queda con ella por algún tiempo.

  • Como SLaks dijo, sus colecciones no debe ser null en lugar de su tamaño sea igual a cero. En ese caso, el aumento de bucle no el error.
  • usted puede quitar el bloqueo de la si y tendría el mismo efecto
  • Yo no puedo quitar el «si» del bloque. Si en el caso de la lista1 es null, entonces habrá un NullPointerException
  • Me refería a que tipo de if(list1 != null)for(Object obj : list1){...} en otras palabras, quitar las llaves de todo para que de esta manera se puede conservar en una línea
  • Interesante… pero yo probablemente no va a conseguir que pasar la revisión de código 🙂
  • Supongo que la respuesta correcta es que: no hay manera de hacerla más corta. hay algunas técnicas como las descritas en los comentarios, pero no veo a mí mismo con ellas. Creo que es mejor escribir un «si» bloquear el uso de esas técnicas. y sí.. antes de que nadie lo menciona de nuevo 🙂 «idealmente» el código debe ser diseñado de tal esa lista nunca debe ser un valor nulo.
  • posibles duplicados de Null comprobar en un aumento de bucle

InformationsquelleAutor rk2010 | 2011-05-20

9 Comentarios

  1. 79

    Si es posible, debe diseñar su código para que las colecciones no están null en el primer lugar.

    null colecciones son de mala práctica (por esta razón); se debe utilizar vacía colecciones en su lugar. (por ejemplo, Colecciones.emptyList())

    Alternativamente, usted podría hacer un contenedor de la clase que implementa Iterable y toma una de las colecciones, y maneja un null colección.

    Entonces, usted puede escribir foreach(T obj : new Nullable<T>(list1))

    • Yo sólo soy uno de los desarrolladores… un humilde clasificado en eso 🙂
    • si usted está usando medicamentos genéricos es mejor usar las Colecciones.emptyList() en lugar de las Colecciones.EMPTY_LIST; es el tipo de seguro.
    • Más como se hace el casting para usted. No hay genéricos de tipos en tiempo de ejecución con cualquiera de los dos casos, y la aplicación de emptyList() internamente contiene el molde (con una supresión desactivada demasiado).
    • Esto resultó ser un mal diseño para mí. El lugar coloqué fue utilizada por JAX – B a unmarshall datos de Estas listas son inmutables y que iba a probar y añadir a ellos. Creo que usted debe considerar esta demasiado stackoverflow.com/questions/5552258/…
  2. 42
    public <T extends Iterable> T nullGuard(T item) {
      if (item == null) {
        return Collections.EmptyList;
      } else {
        return item;
      }
    }

    le permitirá escribir

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

    Por supuesto, esto realmente mueve la complejidad en otros lugares.

    • Buena respuesta, pero probablemente debe ser estático.
  3. 32

    Supongo que la respuesta correcta es que: no hay manera de hacerla más corta. Hay algunas técnicas como las descritas en los comentarios, pero no veo a mí mismo con ellas. Creo que es mejor escribir un «si» bloquear el uso de esas técnicas. y sí.. antes de que nadie lo menciona de nuevo 🙂 «idealmente» el código debe ser diseñado de tal lista no debe ser nunca una null

  4. 18

    En Java 8 no hay otra solución disponible mediante java.util.Optional y la ifPresent-método.

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

    Así, no es una solución para el problema exacto pero es una oneliner y, posiblemente, más elegante.

  5. 10

    Apache Commons

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

    Google Guayaba

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

    Cuánto más corto que lo quieres ser? Es sólo un extra de 2 líneas Y es clara y concisa de la lógica.

    Creo que la cosa más importante que tienes que decidir es si null es un valor válido o no. Si no son válidos, debe escribir el código para impedir que esto suceda. A continuación, usted no necesita este tipo de verificación. Si usted va a obtener una excepción mientras se hace un foreach bucle, que es una señal de que hay un error en alguna otra parte del código.

    • por desgracia, en muchas situaciones de tocar los métodos que le da a estas listas pueden crear problemas para mí… no Es la primera vez que vi a los métodos de «esperando» null a ser devueltos por otros métodos.
    • Me preguntaba que podría ser más corto, porque recientemente me encontré con algunos Groovy código de comprobación para el uso de null «?».. se olvidó de lo que su llamado.
  7. 5

    1) si list1 es un miembro de una clase, crear la lista en el constructor, por lo que es allí y no nulos, a pesar de vacío.

    2) para (Object obj : lista1 != null ? list1 : new ArrayList())

    • interesante.. habrá que probar
    • Mucho mejor el uso de las Colecciones.emptyList(). ¿Por qué asignar algo a la basura la recoge?
    • Buena sugerencia, gracias.

Dejar respuesta

Please enter your comment!
Please enter your name here