¿Devuelve la lista predeterminada si la lista está vacía usando Java 8 Streams?

9

¿Hay alguna manera de que lo siguiente se pueda realizar como un conjunto de operaciones de flujo, en lugar de verificar explícitamente si los productos recomendados están vacíos y luego devolver la lista predeterminada o devolver la 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;
}
usuario3495691
fuente
44
¿Qué hay de malo con tu código existente?
Andy Turner
@AndyTurner De acuerdo. El código es bueno como es. La única mejora que haría es usar el operador ternario en lugar de la instrucción if-else . Sin embargo, todavía es una cuestión de gustos.
ETO
@ETO No hay nada de malo, pero estaba intentando / con la esperanza de descubrir si hay una manera de hacerlo simplemente usando Stream APIs sin verificaciones de condición explícitas. Gracias por la respuesta. Me gusta la sugerencia del operador ternario.
user3495691

Respuestas:

5

Puedes probar esto:

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

Si bien podría lograr su objetivo utilizando Optional, todavía optaría por el antiguo operador ternario.

En este caso particular, tiene mucho más sentido y mejora la legibilidad:

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

Si usando Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Consorcio inactivo
fuente