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.
Considérons une situation dans laquelle nous avons une liste
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>
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!