validate util for check java collections null java-8 java-stream

for - java util optional java 7



Colección nula segura como Stream en Java 8 (5)

Estoy buscando un método que pueda hacer la transmisión de la colección, pero es nulo seguro. Si la colección es nula, se devuelve una secuencia vacía. Me gusta esto:

Utils.collectionAsStream(collection).filter(...);

He creado mi propio método:

public static <T> Stream<T> collectionAsStream(Collection<T> collection) { if (collection == null) { return Stream.empty(); } return collection.stream(); }

Pero tengo curiosidad, si hay algo como esto en el estándar JDK?


Podrías usar Optional :

Optional.ofNullable(collection).orElse(Collections.emptySet()).stream()...

Elegí Collections.emptySet() arbitrariamente porque el valor predeterminado en la collection casos es nulo. Esto dará como resultado que la llamada al método stream() genere un Stream vacío si la collection es nula.

Ejemplo:

Collection<Integer> collection = Arrays.asList (1,2,3); System.out.println (Optional.ofNullable(collection).orElse(Collections.emptySet()).stream().count ()); collection = null; System.out.println (Optional.ofNullable(collection).orElse(Collections.emptySet()).stream().count ());

Salida:

3 0

Alternativamente, como sugirió marstran, puedes usar:

Optional.ofNullable(collection).map(Collection::stream).orElse(Stream.empty ())...


Puede usar la función org.apache.commons.collections4.CollectionUtils :: emptyIfNull:

org.apache.commons.collections4.CollectionUtils.emptyIfNull(list).stream().filter(...);


Puedes usar algo así:

public static void main(String [] args) { List<String> someList = new ArrayList<>(); asStream(someList).forEach(System.out::println); } public static <T> Stream<T> asStream(final Collection<T> collection) { return Optional.ofNullable(collection) .map(Collection::stream) .orElseGet(Stream.empty()); }


Si descargar la biblioteca org.apache.commons.collections4 no es una opción, simplemente puede escribir su propio método de envoltorio / conveniencia.

public static <T> Stream<T> asStream(final Collection<T> collection) { return collection == null ? ( Stream<T> ) Collections.emptyList().stream() : collection.stream(); }

O envolver la colección con Optional.ofNullable

public static <T> Stream<T> asStream(final Collection<T> collection) { return Optional.ofNullable(collection) .orElse( Collections.emptySet()).stream(); }


Su método collectionAsStream() se puede simplificar a una versión incluso más simple que cuando se usa Optional :

public static <T> Stream<T> collectionAsStream(Collection<T> collection) { return collection == null ? Stream.empty() : collection.stream(); }

Tenga en cuenta que en la mayoría de los casos, probablemente sea mejor probar la nulidad antes de construir el flujo de datos:

if (collection != null) { collection.stream().filter(...) } // else do nothing

Lo que desea parece ser útil solo cuando necesita devolver la secuencia (incluso para el mapeo plano), o tal vez concatenarla con otra.