web-dev-qa-db-fra.com

Collection non sécurisée en tant que 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?

41
Gondy

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

  org.Apache.commons.collections4.CollectionUtils.emptyIfNull(list).stream().filter(...);
35
greg

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 ())...
71
Eran

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.

8
Didier L

Pas sûr que ça aide, mais depuis Java 9, vous pouvez simplement écrire:

Stream.ofNullable(nullableCollection)
      .flatMap(Collection::stream)
6
fhiegel

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();
}
5
alltej

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);
}
4
g-t