Flux Null-Safe Java à partir de collections

1. Vue d’ensemble

Dans ce didacticiel, nous verrons comment créer des flux null-safe à partir de collections Java.

Pour commencer, une connaissance des méthodes, références Lambda, options optionnelles et API de Java 8 est nécessaire pour bien comprendre ce document.

Si vous ne connaissez pas l’un de ces sujets, jetez un œil à nos précédents articles:

2. Dépendance Maven

Avant de commencer, il existe une dépendance Maven dont nous aurons besoin pour certains scénarios:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.2</version>
</dependency>

3. Création de flux à partir de collections

L’approche de base pour créer une Stream à partir de tout type de Collection consiste à appeler les méthodes stream () ou parallelStream () de la collection en fonction de le type de flux requis:

Collection<String> collection = Arrays.asList("a", "b", "c");
Stream<String> streamOfCollection = collection.stream();

Notre collection aura très probablement une source externe à un moment donné. Nous aurons probablement une méthode similaire à celle ci-dessous lors de la création de flux à partir de collections:

public Stream<String> collectionAsStream(Collection<String> collection) {
    return collection.stream();
}

Cela peut causer des problèmes. Lorsque la collection fournie pointe vers une référence null , le code lève une NullPointerException à l’exécution.

La section suivante explique comment nous pouvons nous protéger contre cela.

4. Création de flux de collection créés Null-Safe

4.1. Ajouter des contrôles pour empêcher les déréférences Null

Pour éviter les exceptions involontaires de pointeur null , nous pouvons opter pour des vérifications afin d’éviter les références null lors de la création de flux à partir de collections:

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

Cette méthode pose cependant quelques problèmes.

Tout d’abord, la vérification null gêne la logique d’entreprise en réduisant la lisibilité générale du programme.

Deuxièmement, l’utilisation de null pour représenter l’absence de valeur est considérée comme une approche erronée après Java SE 8: il existe un meilleur moyen de modéliser l’absence et la présence d’une valeur.

Il est important de garder à l’esprit que Collection vide n’est pas identique à Collection null__. Alors que le premier indique que notre requête n’a pas de résultats ni d’éléments à afficher, le second suggère qu’une sorte d’erreur est survenue au cours du processus.

4.2. Utilisez la méthode emptyIfNull de la bibliothèque CollectionUtils

Nous pouvons choisir d’utiliser la bibliothèque CollectionUtils d’Apache Commons pour garantir la sécurité de notre flux. Cette bibliothèque fournit une méthode emptyIfNull qui renvoie une collection vide immuable à partir d’une collection null en tant qu’argument, ou la collection elle-même sinon:

public Stream<String> collectionAsStream(Collection<String> collection) {
    return emptyIfNull(collection).stream();
}

C’est une stratégie très simple à adopter. Cependant, cela dépend d’une bibliothèque externe. Si une stratégie de développement logiciel restreint l’utilisation d’une telle bibliothèque, cette solution est alors rendue à null et vide.

4.3. Utiliser Optional de Java 8

Https://www.baeldung.com/java-optional[ Optional ]de Java SE 8 est un conteneur à valeur unique qui contient une valeur ou ne la contient pas. Lorsqu’une valeur est manquante, le conteneur Optional est dit vide.

L’utilisation de Optional peut être considérée comme la meilleure stratégie globale pour créer une collection null-safe à partir d’un flux.

Voyons comment l’utiliser, suivi d’une discussion rapide ci-dessous:

public Stream<String> collectionToStream(Collection<String> collection) {
    return Optional.ofNullable(collection)
      .map(Collection::stream)
      .orElseGet(Stream::empty);
}
  • Optional.ofNullable (collection) crée un objet Optional à partir de

la collection transmise. Un objet Optional vide est créé si le collection est null. map (Collection :: stream) ** extrait la valeur contenue dans le

Objet Optional en tant qu’argument de la méthode map ( Collection.stream () ) orElseGet (Stream :: empty) ** renvoie la valeur de repli dans l’événement

que l’objet Optional est vide, c’est-à-dire que la collection transmise est null .

Par conséquent, nous protégeons notre code de manière proactive contre les exceptions inattendues de pointeur null.

4.4. Utiliser Stream OfNullable de Java 9

En examinant notre exemple ternaire précédent dans la section 4.1. et compte tenu de la possibilité que certains éléments puissent être null au lieu de Collection , nous disposons de la méthode ofNullable dans la classe Stream .

Nous pouvons transformer l’échantillon ci-dessus en:

Stream<String> collectionAsStream(Collection<String> collection) {
  return collection.stream().flatMap(s -> Stream.ofNullable(s));
}

5. Conclusion

Dans cet article, nous avons brièvement rappelé comment créer un flux à partir d’une collection donnée. Nous avons ensuite procédé à l’exploration des trois stratégies clés permettant de s’assurer que le flux créé est protégé de nullité lors de la création à partir d’une collection.

Enfin, nous avons souligné la faiblesse de l’utilisation de chaque stratégie, le cas échéant.

Comme d’habitude, le code source complet accompagnant l’article est disponible over sur GitHub .