Trả về danh sách mặc định nếu danh sách trống bằng java 8 Streams?


9

Có cách nào để bên dưới có thể được thực hiện dưới dạng một tập hợp các hoạt động luồng, thay vì kiểm tra rõ ràng nếu đề xuấtSản phẩm trống thì trả về danh sách mặc định khác trả về danh sách đã lọc không?

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

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

    return recommededProducts;
}

4
Có gì sai với mã hiện tại của bạn?
Andy Turner

@AndyTurner Đồng ý. Các mã là tốt như nó là. Cải tiến duy nhất tôi sẽ làm là sử dụng toán tử ternary thay vì câu lệnh if-other . Nó vẫn là một vấn đề của hương vị mặc dù.
ETO

@ETO Không có gì sai, nhưng tôi đã cố gắng / hy vọng tìm hiểu xem có cách nào để làm điều đó chỉ bằng cách sử dụng API Stream với các kiểm tra điều kiện rõ ràng. Cảm ơn đã trả lời - Tôi thích đề xuất của nhà điều hành ternary.
user3495691

Câu trả lời:


5

Bạn có thể thử điều này:

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

5

Mặc dù bạn có thể đạt được mục tiêu của mình bằng cách sử dụng Optional, tôi vẫn sẽ chọn nhà điều hành ternary cũ đơn giản.

Trong trường hợp cụ thể này, nó có ý nghĩa hơn nhiều và cải thiện khả năng đọc:

return recommendedProducts.isEmpty() ? DEFAULT_PRODUCTS : recommendedProducts;

4

Có bằng cách sử dụng Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.