2017-06-01 16 views
7

Tôi có một danh sách các đối tượng. Mỗi đối tượng chứa một danh sách khác. Tôi muốn lọc danh sách với điều kiện trên danh sách bên trong.Lọc danh sách có điều kiện trong danh sách bên trong

Ví dụ:

Có danh sách các nhà máy. Mỗi nhà máy chứa một danh sách các mẫu xe khác nhau mà nó sản xuất. Tôi muốn lọc danh sách nhà máy theo cách như vậy mà tôi sẽ chỉ nhận được các nhà máy sản xuất Mazda3.

Tôi có thể làm điều đó bằng lambda như thế nào?

Nó phải là một cái gì đó tương tự như sau:

factories.stream().filter(f -> f.getCars().stream().filter(c -> C.getName().equals("Mazda3")).).collect(Collectors.toList()); 

Trả lời

10

Nếu tôi hiểu đúng (và đơn giản hóa ví dụ của bạn)

List<List<Integer>> result = Arrays.asList(
         Arrays.asList(7), 
         Arrays.asList(1, 2, 3), 
         Arrays.asList(1, 2, 4), 
         Arrays.asList(1, 2, 5)) 
      .stream() 
      .filter(inner -> inner.stream().anyMatch(x -> x == 5)) 
      .collect(Collectors.toList()); 

    System.out.println(result); // only the one that contains "5"[[1,2,5]] 

EDIT

Sau khi nhìn thấy ví dụ của bạn, bạn đang tìm kiếm anyMatch

+0

Cảm ơn bạn Eugene! –

6

Đây là cái gì đó nên làm:

factories.stream() 
     .filter(factory -> factory.getCars().stream() 
          .anyMatch(car -> searchedName.equals(car.getName()))) 
     .collect(Collectors.toList()) 

Nhưng nó sẽ là thiết kế tốt hơn nếu bạn có thể thêm một phương pháp cụ thể về lớp nhà máy của bạn :

factories.stream() 
     .filter(factory -> factory.hasProduced(model)) 
     .collect(Collectors.toList()) 

Xem thêm "runnable" example online - vì nó chỉ cho thấy rằng ods vượt qua biên soạn, không phải là một bản demo đầy đủ với dữ liệu, nhưng bạn có thể làm điều đó cho mình trong mã của riêng bạn, vì vậy ...;)

+3

tôi thích cách tiếp cận thứ hai của bạn. –

Các vấn đề liên quan