Ich habe eine Kombination von Abfragen einer Datenbank mit jooq und nach der Verarbeitung des Ergebnisses mit den Streams. Allerdings habe ich das Gefühl, dass mein Code nicht gut lesbar und nicht präzise genug ist. Wie kann ich meinen Code verbessern, um meine Absicht besser auszudrücken?Wie zu vermeiden, multiple Streaming bei der Verwendung von sammeln
sql
.select(field("USER_NAME", String.class))
.from(table("CWD_USER"))
.fetch()
.stream()
.map(f -> f.getValue(field("USER_NAME", String.class)))
.collect(Collectors.groupingBy(s -> StringUtils.split(s, "-")[0], Collectors.counting()))
.entrySet().stream()
.sorted(new java.util.Comparator<Entry<String, Long>>() {
@Override
public int compare(Entry<String, Long> o1,
Entry<String, Long> o2) {
return o2.getValue().compareTo(o1.getValue());
}
})
.forEach(e -> System.out.println(String.format("%13s: %3d", e.getKey(), e.getValue())));
Zuerst habe ich Probleme mit dem multiples Streaming. Ich streame zuerst das Ergebnis von jooq, dann streame ich die gesammelte Karte. Auch der Komparator scheint weithin prominent zu sein. Sicher könnte ich eine Klasse daraus machen, aber vielleicht gibt es eine andere Lösung.
Auch wenn Sie nicht wissen, die Existenz von [ 'Map.Entry.comparingByValue (...) '] (http://docs.oracle.com/javase/8/docs/api/java/util/Map.Entry.html#comparingByValue--), ich verstehe nicht, warum du denkst, dass du eine verwenden musst innere Klasse für den Comparator, da Sie bereits an den anderen Stellen in Ihrem Code Lambda-Ausdrücke kennen gelernt haben. – Holger
Als Referenz wäre das entsprechende Lambda '.sorted ((o1, o2) -> o2.getValue(). CompareTo (o1.getValue()))'. Danke, dass du @Holger darauf hingewiesen hast. –
'Ich streame zuerst das Ergebnis von jooq dann streame ich die gesammelte Karte - nein. Sie streamen die Ergebnisse von jooq und das ist es. In Ihrem Beispiel werden keine weiteren Streams angezeigt, dh ein einzelner Stream mit einigen Zwischenoperationen und genau einer Terminaloperation. So arbeiten Streams. Wenn Sie die Kernfunktionalität von Streams "vermeiden" möchten, müssen Sie klassische foreach/for/while - Loops verwenden. Aber ehrlich gesagt: Das wäre ein Downgrade ... Streams sind sehr prägnant und schön - Ihr eigener Code demonstriert dies. Die gleiche Funktionalität würde mindestens 100 Zeilen Code ohne Streams benötigen. – specializt