ส่งคืนรายการเริ่มต้นหากรายการว่างเปล่าโดยใช้ java 8 Streams?


9

มีวิธีใดบ้างเพื่อให้สามารถดำเนินการด้านล่างเป็นชุดการดำเนินการสตรีมหนึ่งชุดแทนการตรวจสอบอย่างชัดเจนว่าถ้า RecommendedProducts ว่างเปล่าจากนั้นส่งคืนรายการเริ่มต้นมิฉะนั้นจะส่งคืนรายการที่กรองหรือไม่

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

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

    return recommededProducts;
}

4
มีอะไรผิดปกติกับรหัสที่คุณมีอยู่
Andy Turner

@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;

4

ใช่โดยใช้ Optional

return Optional.of(this.newProducts.stream()
                                   .filter(isAvailable)
                                   .collect(Collectors.toList()))
                    .filter(l->!l.isEmpty())
                    .orElse(DEFAULT_PRODUCTS);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.