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;
}

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));

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;

4

Tak, używając Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.