Oft besteht die Notwendigkeit, Ergebnisse für eine Abfrage wie zu transformieren:Liste <Object[]> zur Karte <K, V> in Java 8
select category, count(*)
from table
group by category
auf eine Karte, in der Schlüssel-Kategorien und Werte Anzahl der Datensätze zu der gleichen Kategorie gehören, .
Viele Persistenz-Frameworks geben die Ergebnisse einer solchen Abfrage als List<Object[]>
zurück, wobei Objektarrays zwei Elemente enthalten (Kategorie und Anzahl für jede zurückgegebene Ergebnismengenzeile).
Ich versuche, die beste Möglichkeit zu finden, diese Liste in die entsprechende Karte zu konvertieren.
Natürlich wäre traditioneller Ansatz beinhaltet die Karte erstellen und die Einträge manuell setzen:
Map<String, Integer> map = new HashMap<>();
list.stream().forEach(e -> map.put((String) e[0], (Integer) e[1]));
Der erste Einzeiler, die ich in dem Sinn kam, war es, die aus der Box verfügbar Collectors.toMap
Kollektor zu nutzen:
Allerdings finde ich diese e -> (T) e[i]
Syntax ein bisschen weniger lesbar als der traditionelle Ansatz. Um dies zu überwinden, könnte ich eine util Methode erstellen, die ich in allen solchen Situationen wiederverwenden können:
public static <K, V> Collector<Object[], ?, Map<K, V>> toMap() {
return Collectors.toMap(e -> (K) e[0], e -> (V) e[1]);
}
Dann habe ich ein perfektes Einzeiler bekam:
Map<String, Integer> map = list.stream().collect(Utils.toMap());
Es gibt sogar keine Notwendigkeit, Cast-Schlüssel und Wert wegen Typinferenz. Dies ist jedoch für andere Leser des Codes (Collector<Object[], ?, Map<K, V>>
in der util-Methodensignatur usw.) etwas schwieriger zu verstehen.
Ich frage mich, gibt es noch etwas in der Java 8 Toolbox, die dazu beitragen könnte, dass dies in einer lesbareren/eleganteren Weise erreicht wird?
Sie haben bereits einen Arbeitscode, der eine einzelne Zeile ist. Ich bin nicht sicher, was mehr "Werkzeuge" Sie brauchen. Für welche Art von Antworten interessieren Sie sich? – Tunaki
Was Sie tun, scheint in Ordnung zu sein, außer dass ich eine 'Klasse' und 'Klasse ' an 'toMap' übergeben würde, damit die Umwandlungen überprüft werden können. –
Radiodef
@Tunaki Wahr. Aber ich denke, dass es für mich und für die anderen vorteilhaft wäre, Beispiele zu sehen, wie dies weiter verbessert werden kann, damit es in diesem und ähnlichen Anwendungsfällen angewendet werden kann. –