2017-04-23 7 views
0

Ich versuche, ein Stück Code zu schreiben, der Folgendes tut (pseudocadish), aber mit Streams. Ich versuche es herauszufinden, aber ich kann es nicht korrekt abbilden. Vermutlich vermisse ich etwas Wissen, dass ich etwas übersehen habe. Hat jemand das Wissen, um mir zu helfen?Java-Stream-Liste <X> zu Karte <X, List<Y>>

Vielen Dank im Voraus! :-)

Map<X, List<Y>> result= ...; 

List<X> allX = getAllNeededX(); 
for(X x : allX) { 
    List<Y> matchingY = getMatchingY(x.id); 
    SortListOfYByProperty 
    result.put(x, sortedY) 
} 
+0

Mit welchem ​​Teil kämpfen Sie? –

+0

Was sollen die Schlüssel und Werte Ihrer Karte darstellen? –

+1

Was hast du bisher versucht? – Flown

Antwort

2

Hier sind einige Optionen.

public static void main(String[] args) { 

    Map<X, List<Y>> results = new HashMap<>(); 
    List<X> allX = getAllX(); 

    //simple way to just replace old for loop with forEach 
    allX.stream().forEach(x -> { 
     List<Y> matchingY = getMatchingY(x.id); 
     sortListY(matchingY); 
     results.put(x, matchingY); 
    }); 

    //a little bit fancier, assumes sortListY return List<Y> 
    allX.stream() 
      .map((X x) -> new AbstractMap.SimpleEntry<>(x, sortListY(getMatchingY(x.id)))) 
      .forEach(e -> results.put(e.getKey(), e.getValue())); 

    //more fancy, assumes sortListY return List<Y> 
    Map<X, List<Y>> results2 = allX.stream() 
      .map((X x) -> new AbstractMap.SimpleEntry<>(x, sortListY(getMatchingY(x.id)))) 
      .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); 

    //most fancy, assumes sortListY return List<Y> 
    Map<X, List<Y>> results3 = allX.stream() 
      .collect(Collectors.toMap(Function.identity(), x -> sortListY(getMatchingY(x.id)))); 


    //most fancy part 2, assumes sortListY return List<Y> 
    Map<X, List<Y>> results4 = allX.stream() 
      .collect(Collectors.toMap(x -> x, x -> sortListY(getMatchingY(x.id)))); 

} 
+1

Sie sollten die 'sortListY()' innerhalb von 'collect()' ausführen, um die Zwischenzuordnung zu Einträgen zu vermeiden. –

+1

@DidierL gute Idee, lass mich das versuchen, danke –

1

Didier Link hat mir sehr geholfen.

Ich könnte die erste Liste von X und einen separaten Stream für die sortierte Liste von Y machen, aber ich war nicht in der Lage, alles zu kombinieren.

Mit dem Link von Didier kam ich zu dem folgenden, der meinen Unittest erfolgreich gemacht:

return getAllX().stream().collect(toMap(x -> x, x -> getSortedAndMatchingY(x.id))); 

zu einem separaten Verfahren Durch Bewegen die Sortierung als die obige Antwort vorgeschlagen und eine Eingabe von der Verbindung mit dieser kam daran denken und es scheint zu funktionieren. Danke für die Eingabe :-)

Verwandte Themen