将两个foreach更改为一个流

时间:2017-12-18 09:19:37

标签: java for-loop java-stream

有人可能知道如何用stream()替换它?

for (Customer customer : customers) {
    if (customer.getProducts() != null && customer.getProducts().getProduct() != null) {
        for (Product product : customer.getProducts().getProduct()) {
            if (product.getId().equals(productId)) {
                return Optional.of(product);
            }
        }
    }
}

我知道,我可以替换的第二个foreach:

customer.getProducts().getProduct().stream().filter(a -> a.getId().equals(productId)).findAny();

但是如何用一个流替换两个foreach?

2 个答案:

答案 0 :(得分:4)

使用flatMap获取所有StreamProduct的{​​{1}}个。

Customer

答案 1 :(得分:2)

就像@Eran的答案已经是正确的,我更喜欢下面的内容。唯一的区别是每行只有一个操作(最后有更多行的成本),这在我的眼睛更清洁:

Optional<Product> product = customers.stream()     // Stream<Customer>
         .map(Customer::getProducts)               // Stream<Products>
         .filter(Objects::nonNull)                 // filter null values out
         .map(Products::getProduct)                // Stream<Collection<Product>>
         .filter(Objects::nonNull)                 // filter null values out
         .flatMap(Collection::stream)              // Stream<Product>
         .filter(p -> p.getId().equals(productId)) // filter product with id out
         .findAny();                               // Optional<Product>