Standardliste zurückgeben, wenn die Liste mit Java 8 Streams leer ist?

9

Gibt es eine Möglichkeit, dass das Folgende als ein Satz von Stream-Operationen ausgeführt werden kann, anstatt explizit zu prüfen, ob empfohlene Produkte leer sind, und dann die Standardliste zurückzugeben, andernfalls die gefilterte Liste zurückzugeben ?

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

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

    return recommededProducts;
}
user3495691
quelle
4
Was stimmt nicht mit Ihrem vorhandenen Code?
Andy Turner
@ AndyTurner zustimmen. Der Code ist so gut wie er ist. Die einzige Verbesserung, die ich tun würde, ist die Verwendung eines ternären Operators anstelle einer if-else- Anweisung. Es ist aber immer noch Geschmackssache.
ETO
@ETO Es ist nichts falsch, aber ich habe versucht / gehofft herauszufinden, ob es eine Möglichkeit gibt, dies zu tun, indem ich nur Stream-APIs ohne explizite Bedingungsprüfungen verwende. Vielen Dank für die Antwort - ich mag den Vorschlag des ternären Operators.
user3495691

Antworten:

5

Sie können dies versuchen:

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

Während Sie Ihr Ziel mit erreichen könnten Optional, würde ich mich immer noch für einen einfachen alten ternären Operator entscheiden.

In diesem speziellen Fall ist es viel sinnvoller und verbessert die Lesbarkeit:

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;
ETO
quelle
4

Ja mit Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Totes Schwimmbad
quelle