2015-01-07 41 views
7

Tôi có một một đối tượng trông giống như sauJava 8 Suối giá trị lọc danh sách trong một danh sách

class MyObject { 

    String type; 
    List<String> subTypes; 

} 

Có thể, đưa ra một danh sách các MyObject để sử dụng Java 8 suối để lọc trên cả hai loại và sau đó là loại phụ?

Cho đến nay tôi có

myObjects.stream() 
    .filter(t -> t.getType().equals(someotherType) 
    .collect(Collections.toList()); 

nhưng trong phạm vi này, tôi cũng muốn một bộ lọc trên mỗi các phân nhóm lọc những người trên một subtype đặc biệt quá. Tôi không thể tìm ra cách để làm điều này.

Một ví dụ sẽ

myObject { type: A, subTypes [ { X, Y, Z } ] } 
myObject { type: B, subTypes [ { W, X, Y } ] } 
myObject { type: B, subTypes [ { W, X, Z } ] } 
myObject { type: C, subTypes [ { W, X, Z } ] } 

tôi sẽ vượt qua trong MatchType B và SUBTYPE Z, vì vậy tôi mong chờ một kết quả -> myObject loại B, phân nhóm: W, X, Z

sau hiện đang trả về 2 mục trong danh sách.

myObjects.stream() 
    .filter(t -> t.getType().equals("B") 
    .collect(Collections.toList()); 

nhưng tôi muốn thêm bộ lọc bổ sung vào từng loại phụ và chỉ khớp với vị trí 'Z'.

+0

Bạn có thể đưa ra ví dụ về trận đấu và bỏ lỡ không? Phải * tất cả * phần tử trong kết hợp 'subTypes'? –

+0

Bạn có muốn lọc 'subTypes' hay không? – kraskevich

+0

Bạn có ý nghĩa gì bởi "một bộ lọc khác trên mỗi subTypes lọc những bộ lọc trên một loại phụ cụ thể"? Xin vui lòng cho một ví dụ. –

Trả lời

10

Bạn có thể làm:

myObjects.stream() 
     .filter(t -> t.getType().equals(someotherType) && 
         t.getSubTypes().stream().anyMatch(<predicate>)) 
     .collect(Collectors.toList()); 

này sẽ lấy tất cả các đối tượng mà MyObject

  • đáp ứng một tiêu chí liên quan đến việc type thành viên.
  • chứa các đối tượng trong lồng List<String> đáp ứng một số tiêu chí khác, đại diện với <predicate>
+0

anymatch hiện nó: 3 –

8

Tôi thấy câu trả lời chấp nhận từ @kocko đó là cả một câu trả lời tốt và hoàn toàn chính xác. Tuy nhiên có một cách tiếp cận hơi khác, nơi bạn chỉ cần chuỗi các bộ lọc.

final List<MyObject> withBZ = myObjects.stream() 
     .filter(myObj -> myObj.getType().equals("B")) 
     .filter(myObj -> myObj.getSubTypes().stream().anyMatch("Z"::equals)) 
     .collect(Collectors.toList()); 

Điều này về cơ bản là làm tương tự nhưng toán hạng && bị loại bỏ để ưu tiên cho một bộ lọc khác. Chaining hoạt động thực sự tốt cho Java 8 Stream API: s và IMO nó dễ đọc và làm theo mã.

+0

Tôi đồng ý với câu cuối cùng. Cảm ơn –

+0

Bất kỳ lý do nào để sử dụng .stream(). AnyMatch ("Z" :: equals) thay vì chỉ .contains ("Z")? Không chắc chắn nếu tôi thiếu một cái gì đó hoặc nếu họ đang thực sự giống nhau. –

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