Zwracanie domyślnej listy, jeśli lista jest pusta przy użyciu strumieni Java 8?

9

Czy jest jakiś sposób, aby poniższe czynności można było wykonać jako jeden zestaw operacji strumieniowych, zamiast jawnie sprawdzać, czy zalecane Produkty są puste, a następnie zwracać domyślną listę, inaczej zwracać filtrowaną listę ?

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

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

    return recommededProducts;
}
użytkownik3495691
źródło
4
Co jest nie tak z twoim istniejącym kodem?
Andy Turner,
@AndyTurner Zgadzam się. Kod jest dobry. Jedyne ulepszenie, które bym zrobił, to użycie trójskładnikowego operatora zamiast instrukcji if-else . Jednak wciąż jest to kwestia gustu.
ETO,
@ETO Nie ma nic złego, ale próbowałem / miałem nadzieję dowiedzieć się, czy istnieje sposób, aby to zrobić, używając interfejsów API Stream bez jawnego sprawdzania warunków. Dzięki za odpowiedź - podoba mi się sugestia operatora trójskładnikowego.
user3495691,

Odpowiedzi:

5

Możesz spróbować:

List<Product> recommendedProducts 
        = this.newProducts
              .stream()
              .filter(isAvailable)
              .collect(Collectors.collectingAndThen(Collectors.toList(), list -> list.isEmpty() ? DEFAULT_PRODUCTS : list));
Diego Marin
źródło
5

Chociaż możesz osiągnąć swój cel za pomocą Optional, nadal wybrałbym zwykły stary operator trójskładnikowy.

W tym konkretnym przypadku ma to większy sens i poprawia czytelność:

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;
ETO
źródło
4

Tak, używając Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Deadpool
źródło