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

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

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;

4

Ja mit Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.