2014-04-16 36 views
28

Tôi đã sau tình huốngJava 8: nhập danh sách với dòng API

Map<Key, ListContainer> map; 

public class ListContainer{ 
    List<AClass> lst; 
} 

tôi phải hợp nhất tất cả các danh sách lst từ ListContainer đối tượng từ một bản đồ Map.

public static void main(String args[]){ 
    List<AClass> alltheObjectsAClass = map.values().stream(). // continue....  
} 

Bất kỳ ý tưởng nào về cách sử dụng API luồng Java 8?

+0

bạn có thể cung cấp một ví dụ những gì bạn có ý nghĩa với việc sáp nhập? Giả sử bản đồ của bạn là '{a: [1,2], b [3,4]}', bạn có muốn chuỗi chúng, như '[1,2,3,4]' hay tạo danh sách các danh sách, '[[1,2], [3,4]]', hoặc nén chúng '[[1,3], [2,4]]'? Ngoài ra, bạn biết rằng Bản đồ không có thứ tự, phải không? –

+0

@tobias_k Tôi muốn kết quả là '[1,2,3,4]', không được phân loại! –

+0

Nếu 'ListContainer' chỉ bao bọc một' List 'thì bạn có thể thay thế' Bản đồ 'bằng' Bản đồ > ' – ThePyroEagle

Trả lời

82

Tôi nghĩ rằng flatMap() là thứ bạn đang tìm kiếm.

Ví dụ:

List<AClass> allTheObjects = map.values() 
     .stream() 
     .flatMap(listContainer -> listContainer.lst.stream()) 
     .collect(Collectors.toList()); 
+17

Lưu ý rằng bản đồ phẳng có thể đơn giản là' .flatMap (Bộ sưu tập :: stream) ' – Jean

+1

? Tại sao các bình luận bị xóa giải thích tại sao '.flatMap (Collection :: stream)' là không thể ở đây? – Puce

+0

@Puce câu hỏi hay, tuy nhiên đó là loại có thể: nếu 'ListContainer' được đóng gói (tức là có getter cho' lst'), bạn có thể phân tách '.flatMap (->)' thành '.map (ListContainer :: getLst) '' .flatMap (Bộ sưu tập :: stream) ' – TWiStErRob

22

Alternative: Stream.concat()

Stream.concat(map.values().stream(), listContainer.lst.stream()) 
          .collect(Collectors.toList() 
+0

cộng 1 mặc dù nó không trả lời câu hỏi, nó trả lời tiêu đề của câu hỏi –

+0

Chính xác những gì tôi đang tìm kiếm! Cảm ơn! – Hans

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