Повернення списку за замовчуванням, якщо список порожній за допомогою java 8 Streams?


9

Чи є спосіб, щоб нижче можна було виконати як один набір операцій потоку, замість того, щоб чітко перевіряти, чи рекомендованіПродукти порожні, потім повернути список за замовчуванням, ще повернути відфільтрований список ?

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

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

    return recommededProducts;
}

4
Що не так із наявним кодом?
Енді Тернер

@AndyTurner Погоджуюся. Код хороший, як є. Єдине поліпшення, яке я зробив би, - це використання термінального оператора замість заяви if-else . Це все ж питання смаку.
ETO

@ETO Немає нічого поганого, але я намагався / сподівався з’ясувати, чи є спосіб зробити це просто за допомогою API Stream з явними перевірками умов. Дякую за відповідь - мені подобається пропозиція термінального оператора.
користувач3495691

Відповіді:


5

Ви можете спробувати це:

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

5

Хоча ви могли досягти своєї мети, використовуючи Optional, я все одно обрав би звичайного старого потрійного оператора.

У цьому конкретному випадку це має набагато більше сенсу та покращує читабельність:

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;

4

Так, використовуючи Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.