Возвращение списка по умолчанию, если список пуст, используя java 8 Streams? - PullRequest
9 голосов
/ 07 октября 2019

Есть ли способ, чтобы нижеприведенное можно было выполнить как один набор потоковых операций, вместо явной проверки , если рекомендуемые продукты пусты, а затем вернуть список по умолчанию, иначе вернуть отфильтрованный список ?

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

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

    return recommededProducts;
}

Ответы [ 3 ]

5 голосов
/ 07 октября 2019

Хотя вы могли бы достичь своей цели с помощью Optional, я бы все же выбрал простой старый троичный оператор.

В этом конкретном случае это имеет больше смысла и улучшает читабельность:

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;
5 голосов
/ 08 октября 2019

Вы можете попробовать это:

List<Product> recommendedProducts 
        = this.newProducts
              .stream()
              .filter(isAvailable)
              .collect(Collectors.collectingAndThen(Collectors.toList(), list -> list.isEmpty() ? DEFAULT_PRODUCTS : list));
4 голосов
/ 07 октября 2019

Да, используя Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...