Renvoyer la liste par défaut si la liste est vide à l'aide de java 8 Streams?


9

Existe-t-il un moyen pour que ce qui suit puisse être effectué comme un ensemble d'opérations de flux, au lieu de vérifier explicitement si les produits recommandés sont vides, puis retourner la liste par défaut sinon retourner la liste filtrée ?

public List<Product> getRecommendedProducts() {
    List<Product> recommendedProducts 
        = this.newProducts
              .stream()
              .filter(isAvailable)
              .collect(Collectors.toList());

    if (recommendedProducts.isEmpty()) {
        return DEFAULT_PRODUCTS;
    }

    return recommededProducts;
}

4
Quel est le problème avec votre code existant?
Andy Turner

@AndyTurner D'accord. Le code est bon tel quel. La seule amélioration que je ferais est d'utiliser l' opérateur ternaire au lieu de l' instruction if-else . C'est quand même une question de goût.
ETO

@ETO Il n'y a rien de mal, mais j'essayais / espérais savoir s'il y avait un moyen de le faire simplement en utilisant des API Stream sans vérification explicite des conditions. Merci pour la réponse - j'aime la suggestion de l'opérateur ternaire.
user3495691

Réponses:


5

Vous pouvez essayer ceci:

List<Product> recommendedProducts 
        = this.newProducts
              .stream()
              .filter(isAvailable)
              .collect(Collectors.collectingAndThen(Collectors.toList(), list -> list.isEmpty() ? DEFAULT_PRODUCTS : list));

5

Bien que vous puissiez atteindre votre objectif en utilisant Optional, je choisirais toujours un opérateur ternaire ancien.

Dans ce cas particulier, cela a beaucoup plus de sens et améliore la lisibilité:

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;

4

Oui en utilisant Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.