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.