Aplatissement des valeurs facultatives avec Stream::flatMap et Java Streams
Dans Java 8, le framework Stream fournit des API puissantes pour un code concis. Cependant, certains scénarios, impliquant notamment des options, peuvent être difficiles à exprimer succinctement.
Énoncé du problème
Considérez un scénario dans lequel vous disposez d'une liste d'objets et d'une méthode qui résout chaque objet en un facultatif. L'objectif est de mapper les objets sur les options, puis d'obtenir la première valeur non vide.
Une approche simple consisterait à utiliser Things.stream().flatMap(this::resolve).findFirst(). Cependant, flatMap nécessite de renvoyer un flux et les options n'ont pas de méthode stream().
Solution potentielle
Une solution implique l'utilisation d'une opération en plusieurs étapes :
<code class="java">things.stream() .map(this::resolve) .filter(Optional::isPresent) .map(Optional::get) .findFirst();</code>
Bien que cette approche fonctionne, elle semble plutôt verbeuse.
Solutions améliorées
Java 9 et les versions ultérieures offrent des solutions plus élégantes :
Java 16 :
<code class="java">Optional<Other> result = things.stream() .map(this::resolve) .<Other>mapMulti(Optional::ifPresent) .findFirst();</code>
Java 9 :
<code class="java">Optional<Other> result = things.stream() .map(this::resolve) .flatMap(Optional::stream) .findFirst();</code>
Java 8 (solution de contournement) :
Avant Java 9, une fonction d'assistance peut être utilisée :
<code class="java">static <T> Stream<T> streamopt(Optional<T> opt) { return opt.isPresent() ? Stream.of(opt.get()) : Stream.empty(); } Optional<Other> result = things.stream() .flatMap(t -> streamopt(resolve(t))) .findFirst();</code>
Ces solutions améliorées offrent des moyens plus concis et efficaces de gérer les options dans les opérations de flux.
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!