2017-06-29 24 views
5

Có hai bản đồMerge bản đồ kiểu khác nhau vào một trong Java 8

  • <Integer,String> map1 đó là <ID,Question>
  • <Integer,String> map2 đó là <ID,Answer>

Tôi muốn kết hợp chúng thành một bản đồ duy nhất <String,String> resultMap mà là <Question,Answer> sao cho Khóa trong bản đồ này là giá trị từ map1 (Question) và giá trị trong resultMap là giá trị từ map2 (Answer) và giá trị này dựa trên cùng một ID.

Tôi có thể thực hiện điều này dễ dàng trong java 6 như được thấy trong mã bên dưới.

for(Map.Entry<Integer,String> entry:map1.entrySet()){ 
    qaMap.put(entry.getValue(),map2.get(entry.getKey())); 
} 

Nhưng tôi muốn viết điều này trong Java 8 bằng cách sử dụng luồng và lambdas. Làm thế nào để làm điều đó?

Trả lời

6

Vâng giả phím của bạn (ID) là như nhau trong cả hai bản đồ chúng ta có thể làm điều gì đó như

Map<String,String> map = map1.keySet().stream().collect(Collectors.toMap(map1::get, map2::get)); 

Trong tuyên bố trên, map1.keySet().stream() sẽ giúp bạn có một dòng ID. Sau đó, collect(Collectors.toMap(map1::get, map2::get) sẽ tạo Bản đồ từ luồng ID có khóa là map1.get (id) (nghĩa là câu hỏi của bạn) và giá trị là map2.get (ID) (tức là câu trả lời của bạn) cho mỗi id.

3

@Dark giải pháp là thanh lịch Nhưng ai đó nên cung cấp cho giải pháp thay thế mà người mới bắt đầu nên hiểu. Vì vậy, tôi có thể đi với foreachlambda. Bạn có thể lặp qua từng map1 và thêm vào qaMap.

Map<Integer,String> map1 = new HashMap<>(); 
Map<Integer,String> map2 = new HashMap<>(); 
Map<String,String> qaMap = new HashMap<>(); 
map1.put(1,"what is your age"); 
map2.put(1,"25"); 

map1.forEach((k,v)->qaMap.put(v,map2.get(k))); 
System.out.println(qaMap.size()); 
Các vấn đề liên quan