2016-11-13 2 views
1

Ich habe eine Liste von Personen, die ich basierend auf ihrem Alter gruppieren möchte (group1 hat Alter < 20, group2 hat Alter> = 20) und sortiere jede Gruppe basierend auf Name und Alter mit Hilfe von Java 8: Liste der Personen:Gruppierung und Sortierung einer Sammlung mit Java 8 Streams

Gruppe 1:

Ane 12 
Col 14 

Gruppe 2:

James 24 
thomas 34 
Xavier 55 

ich möchte Java verwenden 8, so etwas zu tun:

list.stream().collect(Collectors.groupingBy(... 
+1

Möchten Sie, dass die Gruppen zuerst nach dem Namen oder nach dem Alter sortiert werden? –

+0

@akaliza ist die Frage über die Aufspaltung der Liste in zwei Gruppen oder die Gruppierung nach mehreren Altersgruppen? Wenn es um die Gruppierung nach Altersgruppen geht, könntest du deine Frage aus Gründen der Klarheit aktualisieren (und um meinen Antwortvorschlag zu korrigieren :)) – Shastick

Antwort

2

Sie wollen stattdessen die partitioningBy Sammler verwenden. Es erlaubt Ihnen, ein Prädikat zu spezifizieren und eine Karte zurückgeben von einem boolean verkeilt:

Map<Boolean, List<?>> partitioned = list.stream().sorted(...).collect(Collectors.partitioningBy(...)); 
+0

Was ist, wenn ich Leute zwischen 20 und 50 Jahren haben möchte? kann ich Partitionierung ketten? – akaliza

+1

Nicht wirklich. In diesem Fall müssen Sie eine Funktion schreiben, die für jede Gruppe einen anderen Wert zurückgibt, und dann eine Gruppierung mit dieser Funktion durchführen. –

+0

Ich verstehe, wir haben ein Prädikat, daher kann ich das tun p -> p.getAge()> = 20 && p.getAge() <50 – akaliza

4

Sie bekommen, was Sie wollen von:

  • Sortierung Ihre ganze Sammlung von Menschen nach Alter (und dann Name).
  • Partitionierung.

Beachten Sie, dass die Reihenfolge der einzelnen Partitionen werden beibehalten:

import static java.util.Comparator.comparing; 
import static java.util.stream.Collectors.partitioningBy; 

people.stream() 
    .sorted(
    comparing(Person::getAge) 
     .thenComparing(Person::getName)) 
    .collect(partitioningBy(p -> p.getAge() >= 20)) 

Dank Christ für seine Verbesserungsvorschlag: Back to Java muss so glatt wie eine Reihe von IKEA Montageanleitung sein :)

+2

Sie sollten 'Comparator.comparing (Person :: getAge)' verwenden. –

+1

Danke, es ist sauberer so :) – Shastick

+1

Um es auch noch sauberer zu machen, 'importieren Sie statisch java.util.Collectors.partitioningBy' und' importieren Sie static java.util.Comparator.comparing; ' –

Verwandte Themen