2017-06-29 4 views
5

Es gibt zwei Kartenverschiedene Arten Karten Merge in eine in Java 8

  • <Integer,String> map1 die <ID,Question>
  • <Integer,String> map2 ist die <ID,Answer> ist

ich sie in einer einzigen Karte <String,String> resultMap zusammenführen möchten die ist <Question,Answer> so dass der Schlüssel in dieser Karte der Wert von map1 (Frage) und Wert in resultMap ist Wert von map2 (Antwort) und dies auf der gleichen ID basiert.

Ich kann dies leicht in Java 6 tun, wie in der folgenden Code gesehen.

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

Aber ich möchte dies in Java 8 mit Streams und Lambdas schreiben. Wie geht das?

Antwort

6

Nun vorausgesetzt, Ihre Schlüssel (IDs) sind die gleichen in beiden Karten wir so etwas wie

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

In der obigen Aussage machen kann, map1.keySet().stream() werden Sie einen Strom von IDs erhalten. Dann erstellt collect(Collectors.toMap(map1::get, map2::get) eine Karte aus dem Stream der IDs mit Schlüssel als map1.get (id) (d. H. Ihre Frage) und Wert als map2.get (ID) (d. H. Ihre Antwort) für jede ID.

3

@Dark Lösung ist elegant Aber jemand sollte alternative Lösung geben, die Anfänger verstehen sollte. Also könnte ich mit foreach und lambda gehen. Sie können durch jede map1 iterieren und zur qaMap hinzufügen.

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());