2017-02-28 1 views
0

haben eine zwei Liste der Karte, tun sollte, der Datensatz auf den beiden Listen verbindet, leftJoin, rightJoin, outerJoin und innerJoinListe der Map-Objekte in Java

import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 
import java.util.HashMap; 

public class JoinMap { 
    public static List<Map<String, Object>> getFirstMap() { 
     List<Map<String, Object>> data = new ArrayList<>(); 
     Map<String, Object> dataMap2 = new HashMap<>(); 
     dataMap2.put("user", "vs"); 
     dataMap2.put("data1", 12.0); 
     dataMap2.put("data2", 42.0); 
     dataMap2.put("data3", 32.0); 
     data.add(dataMap2); 
     Map<String, Object> dataMap1 = new HashMap<>(); 
     dataMap1.put("user", "samraj"); 
     dataMap1.put("data1", 11.0); 
     dataMap1.put("data2", 41.0); 
     dataMap1.put("data3", 31.0); 
     data.add(dataMap1); 
     Map<String, Object> dataMap = new HashMap<>(); 
     dataMap.put("user", "varghees"); 
     dataMap.put("data1", 10.0); 
     dataMap.put("data2", 40.0); 
     dataMap.put("data3", 30.0); 
     data.add(dataMap); 
     return data; 
    } 

    public static List<Map<String, Object>> getSecondMap() { 
     List<Map<String, Object>> data = new ArrayList<>(); 
     Map<String, Object> dataMap2 = new HashMap<>(); 
     dataMap2.put("user", "vs"); 
     dataMap2.put("test1", 12.0); 
     dataMap2.put("test2", 42.0); 
     dataMap2.put("test3", 32.0); 
     data.add(dataMap2); 
     Map<String, Object> dataMap1 = new HashMap<>(); 
     dataMap1.put("user", "samraj"); 
     dataMap1.put("test1", 11.0); 
     dataMap1.put("test2", 41.0); 
     dataMap1.put("test3", 31.0); 
     data.add(dataMap1); 
     Map<String, Object> dataMap = new HashMap<>(); 
     dataMap.put("user", "varghees"); 
     dataMap.put("test1", 10.0); 
     dataMap.put("test2", 40.0); 
     dataMap.put("test3", 30.0); 
     data.add(dataMap); 
     return data; 
    } 

    public static List<Map<String, Object>> leftJoin(List<Map<String, Object>> map1, List<Map<String, Object>> map2) { 

    } 
    public static List<Map<String, Object>> rightJoin(List<Map<String, Object>> map1, List<Map<String, Object>> map2) { 

    } 
    public static List<Map<String, Object>> innerJoin(List<Map<String, Object>> map1, List<Map<String, Object>> map2) { 

    } 
    public static List<Map<String, Object>> outerJoin(List<Map<String, Object>> map1, List<Map<String, Object>> map2) { 

    } 

    public static void main(String[] argv) { 
     List<Map<String, Object>> firstMap = getFirstMap(); 
     List<Map<String, Object>> secondMap = getSecondMap(); 
    } 
} 

Gibt es eine einfache Funktionen in Java8 zu diese Methoden durchführen? Ich versuche zu vermeiden, über Daten zu iterieren und neues Dataset zu füllen.

Antwort

1

Sicher gibt es. Hier ist ein Beispiel, das Streams für den inneren Join verwendet. Ich gehe davon aus, dass wir für eine Tatsache wissen, dass wir auf "user" beitreten sollten (wenn nicht, wird es immer komplizierter, aber es kann immer noch getan werden).

public static List<Map<String, Object>> innerJoin(List<Map<String, Object>> map1, List<Map<String, Object>> map2) { 
    return map1.stream().flatMap(m1 -> 
     map2.stream() 
       .filter(m2 -> m1.get("user").equals(m2.get("user"))) 
       .map((Map<String, Object> m2) -> { 
        Map<String, Object> mr = new HashMap<>(); 
        mr.putAll(m1); 
        mr.putAll(m2); 
        return mr; 
       }) 
    ).collect(Collectors.toList()); 
} 

Ich hoffe und denke, dass Sie in der Lage sein werden, die Inspiration zu nehmen und die anderen selbst zu machen.

+0

Ja das ist schön und hat funktioniert. Wenn wir andere Funktionen reparieren können, werde ich dies als Lösung markieren – CrazyProgrammer