Возвращение списка по умолчанию, если список пуст, используя 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;
}
user3495691
источник
4
Что не так с вашим существующим кодом?
Энди Тернер
@AndyTurner Согласен. Код хорош как есть. Единственное улучшение, которое я бы сделал, это использование тернарного оператора вместо оператора if-else . Это все еще дело вкуса, хотя.
ETO
@ETO В этом нет ничего плохого, но я пытался / надеялся выяснить, есть ли способ сделать это, просто используя Stream APIs без явных проверок условий. Спасибо за ответ - мне нравится предложение троичного оператора.
user3495691

Ответы:

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);
Тотализатор, где делаются ставки на смерть знаменитостей
источник