2017-12-30 27 views
1

Ich drucke eine Karte nach Schlüssel mit einem Zwischenobjekt LinkedHashMap wie folgt sortiert;java 8 - Drucken Sie eine Karte sortiert nach Schlüssel

LinkedHashMap<String, AtomicInteger> sortedMap = wcMap.entrySet().stream() 
      .sorted(Map.Entry.comparingByKey()) 
      .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, 
        (oldValue, newValue) -> oldValue, LinkedHashMap::new)); 

sortedMap.forEach((k, v) -> System.out.println(String.format("%s ==>> %d",k, v.get()))); 

Wie kann ich es direkt aus dem Stream vor dem Sammeln drucken?

+0

Was meinst du direkt? Kette 'forEach'? – Eugene

+0

Vor dem Sammeln. – Jeb

+0

Es gibt 'peek' dafür – Eugene

Antwort

1

Falls Sie kein Interesse an den gesammelten LinkedHashMap:

wcMap.entrySet().stream() 
     .sorted(Map.Entry.comparingByKey()) 
     .forEachOrdered(e -> System.out.println(String.format("%s ==>> %d", e.getKey(), e.getValue().get())); 

Oder noch besser:

wcMap.entrySet().stream() 
     .sorted(Map.Entry.comparingByKey()) 
     .map(e -> String.format("%s ==>> %d", e.getKey(), e.getValue().get())) 
     .forEachOrdered(System.out::println); 

Falls Sie noch den resultierenden LinkedHashMap wollen, peek() verwenden:

wcMap.entrySet().stream() 
     .sorted(Map.Entry.comparingByKey()) 
     .peek(e -> System.out.println(String.format("%s ==>> %d", e.getKey(), e.getValue().get()))) 
     .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, 
       (oldValue, newValue) -> oldValue, LinkedHashMap::new)); 
1

Sie können nicht forEach nutzen, bevor sie gesammelt, denn das würde der Strom verbrauchen und das bedeutet, dass Sie nicht mehr sammeln können.

können Sie entweder den peek Zwischen Betrieb eine bestimmte Aktion auszuführen (in erster Linie zu unterstützen das Debuggen, wo Sie die Elemente sehen möchten, wie sie einen bestimmten Punkt in einer Pipeline fließen Vergangenheit) und dann collect oder collect und dann gelten forEach wie du es getan hast.

Beispiel mit peek:

LinkedHashMap<String, AtomicInteger> sortedMap = wcMap.entrySet().stream() 
      .sorted(Map.Entry.comparingByKey()) 
      .peek(e -> System.out.println(String.format("%s ==>> %d", e.getKey(), e.getValue().get()))) 
      .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, 
        (oldValue, newValue) -> oldValue, LinkedHashMap::new)); 

Auch, wenn Sie beim Drucken der Daten nur daran interessiert sind, dann gibt es keine Notwendigkeit, das Ergebnis in eine Map Instanz zu entleeren, da es nicht notwendig ist und vermieden werden kann. So können Sie einfach einen forEach Terminalbetrieb nach dem sorted Betrieb verketten und die Daten drucken.

Verwandte Themen