2017-06-29 30 views
5

iki harita tek bir haritada <String,String> resultMap bunları birleştirmek istiyorum <ID,Answer> Java birine farklı tip haritalar Birleştirme 8

olduğunu <ID,Question>

  • <Integer,String> map2 olduğunu

    • <Integer,String> map1 vardır ki <Question,Answer> şeklindedir, buradaki Anahtar, map1 (Soru) değeri ve resultMap değeri map2 (Answer) değeridir ve bu aynı ID'ye dayanır.

      Bunu, aşağıdaki kodda görüldüğü gibi java 6'da kolayca yapabilirim.

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

      Ancak bunu Java 8'de akışları ve lambdaları kullanarak yazmak istiyorum. Bu nasıl yapılır?

  • cevap

    6

    Eh varsayarak tuşları (kimlik) Yukarıda açıklamada

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

    gibi bir şey yapabilirsiniz, hem haritalarda aynıdır, map1.keySet().stream() size kimlikleri akışı alacak. Daha sonra collect(Collectors.toMap(map1::get, map2::get), her bir kimlik için map1.get (id) (yani, sorunuz) ve map2.get (ID) (yani cevabınız) olarak anahtar ile kimliklerin akışından bir Harita oluşturacaktır.

    3

    @Dark çözümü zariftir Ancak, birilerinin anlaması gereken alternatif bir çözüm sunmalıdır. Böylece foreach ve lambda ile gidebilirdim. Her map1 aracılığıyla yineleyin ve qaMap'a ekleyin.

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