Je cherche une méthode qui peut rendre le flux de collecte, mais est null safe. Si collection est null, le flux vide est renvoyé. Comme ça:
Utils.nullSafeStream(collection).filter(...);
J'ai créé ma propre méthode:
public static <T> Stream<T> nullSafeStream(Collection<T> collection) {
if (collection == null) {
return Stream.empty();
}
return collection.stream();
}
Mais je suis curieux de savoir s’il existe quelque chose comme cela dans JDK standard?
Vous pouvez utiliser la fonction org.Apache.commons.collections4.CollectionUtils :: emptyIfNull:
org.Apache.commons.collections4.CollectionUtils.emptyIfNull(list).stream().filter(...);
Vous pouvez utiliser Optional
:
Optional.ofNullable(collection).orElse(Collections.emptySet()).stream()...
J'ai choisi Collections.emptySet()
arbitrairement comme valeur par défaut dans le cas où collection
est null. Cela aura pour résultat que l'appel de méthode stream()
produira un Stream
vide si collection
est nul.
Exemple :
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 ());
Sortie:
3
0
Alternativement, comme suggéré par Marstran, vous pouvez utiliser:
Optional.ofNullable(collection).map(Collection::stream).orElse(Stream.empty ())...
Votre méthode collectionAsStream()
peut être simplifiée en une version encore plus simple que lorsque vous utilisez Optional
:
public static <T> Stream<T> collectionAsStream(Collection<T> collection) {
return collection == null ? Stream.empty() : collection.stream();
}
Notez que dans la plupart des cas, il est probablement préférable de simplement tester la nullité avant de créer le pipeline de flux:
if (collection != null) {
collection.stream().filter(...)
} // else do nothing
Ce que vous voulez semble être utile uniquement lorsque vous devez renvoyer le flux (y compris pour le flatmapping), ou peut-être le concaténer avec un autre.
Pas sûr que ça aide, mais depuis Java 9, vous pouvez simplement écrire:
Stream.ofNullable(nullableCollection)
.flatMap(Collection::stream)
Si le téléchargement de la bibliothèque org.Apache.commons.collections4
n'est pas une option, vous pouvez simplement écrire votre propre méthode wrapper/commodity.
public static <T> Stream<T> asStream(final Collection<T> collection) {
return collection == null ? ( Stream<T> ) Collections.emptyList().stream()
: collection.stream();
}
Ou bien envelopper la collection avec Optional.ofNullable
public static <T> Stream<T> asStream(final Collection<T> collection) {
return Optional.ofNullable(collection)
.orElse( Collections.emptySet()).stream();
}
Vous pouvez utiliser quelque chose comme ça:
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);
}