85 votes

Collection Null safe sous forme de flux dans Java 8

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?

110voto

Eran Points 35360

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 nul. 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 ())...
 

77voto

greg Points 463

Vous pouvez utiliser la fonction org.apache.commons.collections4.CollectionUtils :: emptyIfNull:

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

9voto

Didier L Points 1408

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 générer 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.

9voto

alltej Points 2489

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 d'encapsulation / commodité.

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

Ou envelopper la collection avec Optional.ofNullable

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

8voto

g-t Points 138

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);
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X