有人可能知道如何用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?
答案 0 :(得分:4)
使用flatMap
获取所有Stream
个Product
的{{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>