Retornando a lista padrão se a lista estiver vazia usando o java 8 Streams?

9

Existe alguma maneira de que o abaixo possa ser executado como um conjunto de operações de fluxo, em vez de verificar explicitamente se recommendedProducts está vazio e retornar a lista padrão ou retornar a lista filtrada ?

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

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

    return recommededProducts;
}
user3495691
fonte
4
O que há de errado com o seu código existente?
Andy Turner
@AndyTurner Concordo. O código é bom como é. A única melhoria que eu faria seria usar o operador ternário em vez da instrução if-else . Ainda é uma questão de gosto.
ETO
@ETO Não há nada errado, mas eu estava tentando / esperando descobrir se há uma maneira de fazer isso usando APIs de fluxo sem verificações de condição explícitas. Obrigado pela resposta - eu gosto da sugestão do operador ternário.
user3495691

Respostas:

5

Você pode tentar isso:

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

Embora você possa alcançar seu objetivo usando Optional, eu ainda optaria por um operador ternário antigo e simples.

Nesse caso em particular, faz muito mais sentido e melhora a legibilidade:

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;
ETO
fonte
4

Sim usando Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Piscina morta
fonte