2017-03-09 38 views
5

Tôi có idList bộ sưu tập chứa ID chuỗi. Trả về tính năng getCollection cho ID duy nhất một tập hợp các mục (loại MyType). Ngoài ra, nó có thể trả về null.Dòng Java: tổng hợp trong danh sách tất cả các tập hợp không phải Null nhận được trong bản đồ()

Vì vậy, đối với nhiều ID từ idList, tôi sẽ nhận được một số giá trị rỗng và một số bộ sưu tập.

Mục tiêu là thu thập tất cả các trả lời của getCollection cho một bộ ID vào Danh sách cuối cùng.

Tôi đã tưởng tượng cái gì đó như

List<MyType> reply = idList.stream().map(id -> getCollection(id)) 
     .filter(p -> p != null).collect(Collectors.toList()); 

nhưng nó dường như không phải là một biểu thức hợp lệ. Làm thế nào để làm cho nó hợp lệ?

Ngoài ra, điều gì về hiệu suất của việc triển khai này?

Trả lời

4

Bạn cần phải sử dụng flatMap -

List<MyType> reply = idList.stream() 
    .map(id -> getCollection(id)) 
    .filter(collection -> collection != null) 
    .flatMap(Collection::stream) 
    .collect(Collectors.toList()); 

Nếu bạn đang suy nghĩ về sự khác biệt giữa các mapflatMap hoạt động, sau đó bạn có thể tham khảo this excellent answer -

Cả hai bản đồ và flatMap có thể được áp dụng cho Luồng và cả hai đều là trả lại Luồng. Sự khác biệt là thao tác bản đồ tạo ra giá trị đầu ra cho mỗi giá trị đầu vào, trong khi hoạt động flatMap tạo ra một giá trị số (không hoặc nhiều) tùy ý cho mỗi giá trị đầu vào .

Điều này được phản ánh trong các đối số cho mỗi thao tác.

Thao tác bản đồ có chức năng, được gọi cho mỗi giá trị trong luồng đầu vào và tạo ra một giá trị kết quả, được gửi đến luồng đầu ra .

Thao tác phẳngMap có chức năng khái niệm muốn tiêu thụ một giá trị và tạo số lượng giá trị tùy ý. Tuy nhiên, trong Java, nó cồng kềnh đối với một phương thức trả về một số tùy ý là giá trị, vì các phương thức có thể trả về chỉ 0 hoặc một giá trị. Người ta có thể tưởng tượng một API trong đó hàm bản đồ cho flatMap lấy một giá trị và trả về một mảng hoặc một Danh sách các giá trị, sau đó được gửi đến đầu ra . Cho rằng đây là thư viện suối, một cách đặc biệt thích hợp để đại diện cho một số tùy ý giá trị trả về là dành cho hàm bản đồ để trả về luồng! Các giá trị từ luồng được người lập bản đồ trả về được thoát ra khỏi luồng và được chuyển đến luồng đầu ra. Các "khối" của các giá trị được trả về bởi mỗi cuộc gọi đến hàm bản đồ không được phân biệt ở tất cả trong luồng đầu ra, do đó đầu ra được cho là đã "làm phẳng".

Sử dụng điển hình là dành cho hàm bản đồ của flatMap để trả về Stream.empty() nếu muốn gửi giá trị bằng 0 hoặc một số thứ như Stream.of (a, b, c) nếu muốn trả về một vài giá trị . Nhưng tất nhiên là mọi luồng đều có thể được trả lại.

+0

Giải thích ngắn gọn về lý do sử dụng flatMap cũng sẽ giúp người khác hiểu được –

+0

@ManuelS. nếu bạn nhấp vào liên kết flatMap, có màu xanh dương, sẽ có một giải thích ngắn gọn về flatMap. – John

+0

flatmap yêu cầu dòng getCollection() trả về danh sách? có thể bạn cần phải thay đổi mã của bạn như thế này ... 'stream() bản đồ (id -> getCollection (id)). flatMap (Danh sách :: dòng)' –

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