Maison > Java > javaDidacticiel > le corps du texte

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

Patricia Arquette
Libérer: 2024-10-23 16:35:02
original
391 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

Java 9 :

<code class="java">Optional<Other> result =
    things.stream()
          .map(this::resolve)
          .flatMap(Optional::stream)
          .findFirst();</code>
Copier après la connexion

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!