Java 8: hợp nhất danh sách với API luồng


80

Tôi có tình huống sau

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 lsttừ các ListContainerđối tượng từ một Mapbản đồ.

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 Java 8 stream API?


Bạn có thể cung cấp một ví dụ về ý nghĩa của bạn với việc hợp nhất? Giả sử bản đồ của bạn là {a: [1,2], b[3,4]}, bạn có muốn xâu chuỗi chúng, giống như [1,2,3,4], 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?
tobias_k

@tobias_k Tôi muốn kết quả là [1,2,3,4], không được sắp xếp!
mat_boy

Nếu ListContainerchỉ kết thúc một List<T>thì bạn có thể thay thế Map<Key, ListContainer>bằngMap<Key, List<T>>
ThePyroEagle

Câu trả lời:


168

Tôi nghĩ đó flatMap()là những gì bạn đang tìm kiếm.

Ví dụ:

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

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

@Puce câu hỏi hay, tuy nhiên nó là loại-of càng tốt: nếu ListContainerđược đóng gói (tức là có một getter cho lst), bạn có thể phân hủy .flatMap(->)thành.map(ListContainer::getLst) .flatMap(Collection::stream)
TWiStErRob

3
@TWiStErRob Vâng, đó là những gì tôi đã viết trong nhận xét ban đầu của mình. Tại sao nó bị xóa?
Puce

@ Đưa ra một ghi chú trong câu trả lời của bạn giải thích lý do tại sao .flatMap(Collection::stream)không thể sẽ tốt hơn, tôi nghĩ. Nên lâu dài hơn.
SQB

1
@Alex vâng, đây là một cách tương ứng. .map(listContainer -> listContainer.lst).filter(Objects::nonNull).flatMap(Collection::stream)
Puce

55

Thay thế: Stream.concat ()

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

2
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
Tony

2

Trong Java 8, chúng ta có thể sử dụng luồng List1.stream (). Collect (Collectors.toList ()). AddAll (List2); Một tùy chọn khác List1.addAll (List2)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.