Возвращение списка по умолчанию, если список пуст, используя 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 В этом нет ничего плохого, но я пытался / надеялся выяснить, есть ли способ сделать это, просто используя 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;

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.