更改两个foreach到一个流

有人可能有任何想法如何将其替换为stream()?更改两个foreach到一个流

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(); 

但我怎么能更换一个流都foreachs?

回答:

使用flatMap得到所有Customer s的所有Product中的Stream

Optional<Product> product = 

customers.stream()

.filter(c -> c.getProducts() != null && c.getProducts().getProduct() != null)

.flatMap(c -> c.getProducts().getProduct().stream())

.filter(p -> p.getId().equals(productId))

.findFirst();

回答:

就像@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>

以上是 更改两个foreach到一个流 的全部内容, 来源链接: utcz.com/qa/262034.html

回到顶部