2014-04-22 24 views
25

Giả sử tôi có Map<String, Integer>. Có cách nào dễ dàng để có được một Map<String, String> từ nó?Cách ánh xạ các giá trị trong bản đồ trong Java 8?

Bằng cách dễ dàng, tôi có nghĩa là không như thế này:

Map<String, String> mapped = new HashMap<>(); 
for(String key : originalMap.keySet()) { 
    mapped.put(key, originalMap.get(key).toString()); 
} 

Nhưng thay vì một số một liner như:

Map<String, String> mapped = originalMap.mapValues(v -> v.toString()); 

Nhưng rõ ràng là không có phương pháp mapValues.

+0

Vâng, đó là bản sao. Lấy làm tiếc. – siledh

Trả lời

53

Bạn cần stream các mục và thu thập chúng trong một bản đồ mới:

Map<String, String> result = map.entrySet().stream() 
        .collect(toMap(Entry::getKey, e -> String.valueOf(e.getValue())); 
+0

Tôi thích điều này tốt hơn nhiều và thậm chí là một dòng (về mặt kỹ thuật). +1 – Rogue

14

Cách dễ nhất để làm như vậy là:

Map<String, Integer> map = new HashMap<>(); 
Map<String, String> mapped = map.entrySet().stream() 
     .collect(Collectors.toMap(Map.Entry::getKey, entry -> String.valueOf(entry.getValue()))); 

Những gì bạn làm ở đây, là:

  1. Lấy Stream<Map.Entry<String, Integer>>
  2. Thu thập kết quả trong bản đồ kết quả:
    1. Ánh xạ các mục nhập vào khóa của chúng.
    2. Ánh xạ các mục nhập với các giá trị mới, kết hợp với String.valueOf.

Lý do bạn không thể làm điều đó trong một lớp lót, là bởi vì giao diện Map không cung cấp như vậy, gần nhất bạn có thể tới đó là map.replaceAll, nhưng phương pháp mà dictates rằng loại nên vẫn giống nhau.

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