2017-12-18 2 views
3

누군가가 어쩌면 어떤 생각을 가지고 있을까요? 이것을 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?

+1

봐 [이 스레드의 중복을 –

+1

을 : 유일한 차이점은 눈 청소기, (마지막으로 더 라인 데의 ​​비용으로) 줄에 하나의 작업을하는 것입니다 ] (https://stackoverflow.com/questions/34406744/refactoring-a-nested-foreach-into-java-8-stream) – GuyKhmel

답변

4

Stream 모두 을 얻으려면 Customers입니다.

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

@Eran의 답변이 이미 맞았으므로 아래에서 더 선호합니다. 아마) flatMap (에

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> 
관련 문제