2017-04-03 5 views
3

Ich habe Probleme herauszufinden, wie man mit der Reinigung einige meiner Code, um dies zu tun:Wie diese Liste der umschlossenen Karten in eine andere Art von Karte Java 8?

Ich habe eine Liste von Context Objekte. Jede Context hat eine String userId und eine Map<String, SomeObject> someObjects.

Ich möchte dies in eine Map<String, SomeObjects>, wo der Kep ist die userId. Um konkreter zu sein:

class Context { 
    String userId; 
    Map<String, List<SomeObject>> // the String here is something other than userId 
    // other stuff, getters/setters 
} 

Bei List<Context> möchte ich Map<String, List<SomeObject> bekommen, aber wo der String ist eigentlich die userId.

Gibt es einen sauberen Weg, dies zu tun?

+0

Wie lautet der Name der 'Map >' Variable? Hat jeder Kontext eine eindeutige "userId"? Jede 'userId' hat viele' 's in der nebenstehenden Karte - wollen Sie all diese Listen zusammenfügen? –

+0

[Frage duplizieren] (http://stackoverflow.com/questions/20363719/java-8-listv-into-mapk-v) – hkasera

+0

gibt es mehr die eine saubere Möglichkeit, aber es ist nicht klar, wo die userId gespeichert ist und Wie können wir es (und die Liste der Objekte) aus dem Kontext – freedev

Antwort

3

Unter der Annahme, ein Context ein String userid und eine List<SomeObject> someObjects:

Map<String, Set<SomeObject>> map = contexts.stream() 
    .collect(Collectors.toMap(Context::getUserid, 
     c -> c.getSomeObjects().values().stream() 
     .flatMap(Collection::stream) 
     .collect(Collectors.toSet()) 
    )); 

Der Schlüssel hier Punkte sind die Verwendung von toMap() von userid und flatmap() drehen einen Stream<List<SomeObject>> in eine Stream<SomeObject>, so dass Sie sammeln sie in einer Sammlung kann zu sammeln.

+2

Würde Collectors.toSet nicht auf bestimmte Elemente achten? –

+1

Es hat keinen Sinn, _both_ '.distinct()' und '.collect (toSet())' zu verwenden. –

+0

@nick ganz so.Ich weiß nicht, was ich dachte (wenn überhaupt) – Bohemian

1

Erstellen Klasse Kontext halten String und Map Datentypen

class Context { 
    String userId; 
    Map<String, List<Integer>> map; 

    public Context(String s, List<Integer> list) { 
     userId = s; 
     map = new HashMap<>(); 
     map.put(userId, list); 
    } 

    public void setValues(String s, List<Integer> list) { 
     map.put(s, list); 
    } 

} 

jetzt die Lösung Klasse zu schaffen, die List<Context> hat

public class Solution { 

    public static void main(String[] args) { 

     List<Integer> list; 

     // Context c1 
     list = new ArrayList<>(Arrays.asList(1, 2, 3)); 
     Context c1 = new Context("dev", list); 

     list = new ArrayList<>(Arrays.asList(-1, -3)); 
     c1.setValues("dev2", list); 

     list = new ArrayList<>(Arrays.asList(-6, -3)); 
     c1.setValues("dev3", list); 

     // Context c2 
     list = new ArrayList<>(Arrays.asList(12, 15, 18)); 
     Context c2 = new Context("macy", list); 

     list = new ArrayList<>(Arrays.asList(-12, -13)); 
     c2.setValues("macy2", list); 

     list = new ArrayList<>(Arrays.asList(-8, -18)); 
     c2.setValues("macy3", list); 

     // Context c3 
     list = new ArrayList<>(Arrays.asList(20, 30)); 
     Context c3 = new Context("bob", list); 

     list = new ArrayList<>(Arrays.asList(-31, -32)); 
     c3.setValues("bob2", list); 

     // Context List 
     List<Context> contextList = new ArrayList<>(); 
     contextList.addAll(Arrays.asList(c1, c2, c3)); 

     retrieveRecords(contextList); 
    } 

    private static void retrieveRecords(List<Context> contextList) { 
     // regular way of retrieving map values 
     for (Context c : contextList) { 
      System.out.println(c.map); 
     } 

     System.out.println(); 

     // Retrieving only those records which has String key as userID 
     for (Context c : contextList) { 
      System.out.println(c.userId + "\t=>\t" + c.map.get(c.userId)); 
     } 
    } 

} 

enter image description here

+0

Vielen Dank für Ihre Antwort, aber mein Hauptproblem war "Ich möchte dies in eine Karte glätten wo der Schlüssel ist die userId" so selektiv Drucken von Datensätzen würde nicht lösen mein spezifisches Problem. Unabhängig davon, erhalten Sie mein upvote für Ihre andere Perspektive! – Otter

+0

Ich schätze es! –

Verwandte Themen