2015-02-27 6 views
8

Ich verwende Java 8 zum Gruppieren nach Daten. Aber die erhaltenen Ergebnisse sind nicht in Ordnung.Java 8 verwaltet die Reihenfolge nicht beim Gruppieren

Hier verwende ich meine Klasse groupingKey, mit der ich dynamisch von UX übergeben werde. Wie kann diese groupByColumns in sortierter Form erhalten werden?

Antwort

27

Das Nichtbestehen der Bestellung ist eine Eigenschaft der Map, die das Ergebnis speichert. Wenn Sie ein bestimmtes Map Verhalten benötigen, müssen Sie request a particular Map implementation. Z.B. LinkedHashMap hält die Einsetzfolge:

groupedResult = people.collect(Collectors.groupingBy(
    p -> new GroupingKey(p, groupByColumns), 
    LinkedHashMap::new, 
    Collectors.mapping((Map<String, Object> p) -> p, toList()))); 

Im Übrigen gibt es keinen Grund, den Inhalt mapList in ein Array zu kopieren, bevor die Stream erzeugen. Sie können einfach mapList.stream() anrufen, um eine entsprechende Stream zu erhalten.

Weiter ist Collectors.mapping((Map<String, Object> p) -> p, toList()) veraltet. p->p ist eine Identitätszuordnung, also gibt es keinen Grund, mapping überhaupt zu beantragen:

groupedResult = mapList.stream().collect(Collectors.groupingBy(
    p -> new GroupingKey(p, groupByColumns), LinkedHashMap::new, toList())); 

Aber auch die GroupingKey veraltet ist. Es enthält im Grunde eine List von Werten, so dass Sie nur einen List als Schlüssel an erster Stelle verwenden können. List s implementieren hashCode und equals entsprechend (aber Sie müssen nicht ändern Sie diese Schlüssel List s danach).

Map<List<Object>, List<Object>> groupedResult= 
    mapList.stream().collect(Collectors.groupingBy(
    p -> groupByColumns.stream().map(p::get).collect(toList()), 
    LinkedHashMap::new, toList())); 
+0

Danke Holger du hast meine Aufgabe einfacher gemacht. Aber ich habe immer noch das Problem, wenn ich nur in dieser gruppierten Spalten Sortierung anwenden möchte dann was soll ich tun? – shreya

Verwandte Themen