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;
}
user3495691
la source
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));
Diego Marin
la source
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;
ETO
la source
4

Oui en utilisant Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Dead Pool
la source