Maison  >  Article  >  Java  >  Comment aplatir les options dans un flux en Java

Comment aplatir les options dans un flux en Java

Barbara Streisand
Barbara Streisandoriginal
2024-10-24 04:16:30244parcourir

How to Flatten Optionals into a Stream in Java

Utilisation facultative de Java 8 avec Stream::flatMap

Stream::flatMap est un outil puissant de Java 8 permettant de combiner plusieurs flux en un seul flux. Cependant, cela nécessite de renvoyer un flux, ce qui peut être problématique lorsqu'il s'agit d'options.

Problème

Considérons une situation dans laquelle nous avons une liste et une méthode qui mappe chaque objet à un élément facultatif. Nous voulons mapper les objets aux options, puis récupérer le premier facultatif non vide.

Une approche naïve utilisant Stream::flatMap etOptional::findFirst échouerait, car les options ne fournissent pas de stream() method:

<code class="java">things.stream().flatMap(this::resolve).findFirst(); // Error!</code>

Solution

Java 16 et versions ultérieures

Java 16 a introduit Stream.mapMulti, qui permet de mapper un facultatif à un flux de ses éléments non vides :

<code class="java">Optional<Other> result =
    things.stream()
          .map(this::resolve)
          .<Other>mapMulti(Optional::ifPresent)
          .findFirst();</code>

Java 9

Java 9 a ajouté Option.stream, qui renvoie directement un flux de la valeur facultative non vide :

<code class="java">Optional<Other> result =
    things.stream()
          .map(this::resolve)
          .flatMap(Optional::stream)
          .findFirst();</code>

Java 8

Pour Java 8, nous pouvons utiliser une fonction d'assistance pour convertir un facultatif en flux :

<code class="java">static <T> Stream<T> streamopt(Optional<T> opt) {
    if (opt.isPresent())
        return Stream.of(opt.get());
    else
        return Stream.empty();
}</code>

Utilisation cette fonction d'assistance, la solution devient :

<code class="java">Optional<Other> result =
    things.stream()
          .flatMap(t -> streamopt(resolve(t)))
          .findFirst();</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn