2014-12-12 26 views
9

Tôi có đối tượng sau đây và một bản đồ:Java 8 suối: lặp trên Bản đồ Lists

MyObject 
    String name; 
    Long priority; 
    foo bar; 

Map<String, List<MyObject>> anotherHashMap; 

Tôi muốn chuyển đổi bản đồ trong Map khác. Khóa của bản đồ kết quả là chìa khóa của bản đồ đầu vào. Giá trị của bản đồ kết quả ist thuộc tính "Tên" của đối tượng của tôi, được sắp xếp theo mức độ ưu tiên.

đặt hàng và giải nén tên không phải là vấn đề, nhưng tôi không thể đưa nó vào bản đồ kết quả. Tôi làm điều đó theo cách cũ của Java 7, nhưng thật tuyệt khi có thể sử dụng API truyền trực tuyến.

Map<String, List<String>> result = new HashMap<>(); 
for (String identifier : anotherHashMap.keySet()) { 
    List<String> generatedList = anotherHashMap.get(identifier).stream()...; 

    teaserPerPage.put(identifier, generatedList); 
} 

Có ai có ý tưởng không? Tôi cố gắng này, nhưng đã bị mắc kẹt:

anotherHashMap.entrySet().stream().collect(Collectors.asMap(..., ...)); 
+0

Ý định không rõ ràng. Bạn có thể giải thích những gì bạn muốn làm gì? –

+0

Giải thích này có tốt hơn không? – waXve

+0

Giá trị bản đồ kết quả của bạn là gì? Danh sách của mỗi 'tên' từ khóa trước đó? – mkobit

Trả lời

10
Map<String, List<String>> result = anotherHashMap 
    .entrySet().stream()     // Stream over entry set 
    .collect(Collectors.toMap(    // Collect final result map 
     Map.Entry::getKey,     // Key mapping is the same 
     e -> e.getValue().stream()   // Stream over list 
      .sorted(Comparator.comparingLong(MyObject::getPriority)) // Sort by priority 
      .map(MyObject::getName)   // Apply mapping to MyObject 
      .collect(Collectors.toList())) // Collect mapping into list 
     ); 

Về cơ bản, bạn truyền qua từng mục nhập và thu thập nó vào bản đồ mới. Để tính toán giá trị trong bản đồ mới, bạn truyền trực tiếp trên List<MyOjbect> từ bản đồ cũ, sắp xếp và áp dụng chức năng ánh xạ và thu thập cho nó. Trong trường hợp này, tôi đã sử dụng MyObject::getName làm ánh xạ và thu thập các tên kết quả thành danh sách.

1

Đối với việc tạo ra bản đồ khác, chúng tôi có thể có một cái gì đó như sau:

HashMap<String, List<String>> result = anotherHashMap.entrySet().stream().collect(Collectors.toMap(elem -> elem.getKey(), elem -> elem.getValue() // can further process it); 

Trên Tôi tái tạo bản đồ một lần nữa, nhưng bạn có thể xử lý các phím hoặc giá trị theo nhu cầu của bạn.

+0

hmm ... Điều đó không hiệu quả. Không có phương pháp thu thập nào trên Bản đồ ... – waXve

+0

Đó phải là '.stream(). Collect' Tôi tin. Ngoài ra, bạn cần ánh xạ danh sách 'MyObject', giống như' elem -> elem.getValue(). Stream(). Map (e -> e.name) ' –

+0

Quên thêm mục nhậpSet(). Stream() cố định cái đó :) –

1
Map<String, List<String>> result = anotherHashMap.entrySet().stream().collect(Collectors.toMap(
    Map.Entry::getKey, 
    e -> e.getValue().stream() 
     .sorted(comparing(MyObject::getPriority)) 
     .map(MyObject::getName) 
     .collect(Collectors.toList()))); 

Tương tự như trả lời của Mike Kobit, nhưng phân loại được áp dụng tại địa điểm chính xác (ví dụ: giá trị được sắp xếp, không phải bản đồ mục) và súc tích hơn phương pháp tĩnh Comparator.comparing được sử dụng để có được sánh để phân loại.

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