Maison  >  Article  >  Java  >  Comment aplatir les valeurs facultatives avec Stream :: flatMap et Java Streams ?

Comment aplatir les valeurs facultatives avec Stream :: flatMap et Java Streams ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-23 16:35:02392parcourir

How to Flatten Optional Values with Stream::flatMap and Java Streams?

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!

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