Java 8 Gruppierung mit benutzerdefinierten Sammler?
Habe ich die folgende Klasse.
class Person {
String name;
LocalDate birthday;
Sex gender;
String emailAddress;
public int getAge() {
return birthday.until(IsoChronology.INSTANCE.dateNow()).getYears();
}
public String getName() {
return name;
}
}
Ich würde gerne in der Lage, die Gruppe nach Alter und sammeln Sie dann die Liste der Personen, Namen, anstatt die Person Liefergegenstand selbst entstanden sind; alle in einem einzigen schönen lamba-Ausdruck.
Zur Vereinfachung alles ich bin Verlinkung meiner aktuellen Lösung zu speichern, dass das Ergebnis der Gruppierung nach Alter und iteriert dann über Sie sammeln die Namen.
ArrayList<OtherPerson> members = new ArrayList<>();
members.add(new OtherPerson("Fred", IsoChronology.INSTANCE.date(1980, 6, 20), OtherPerson.Sex.MALE, "[email protected]"));
members.add(new OtherPerson("Jane", IsoChronology.INSTANCE.date(1990, 7, 15), OtherPerson.Sex.FEMALE, "[email protected]"));
members.add(new OtherPerson("Mark", IsoChronology.INSTANCE.date(1990, 7, 15), OtherPerson.Sex.MALE, "[email protected]"));
members.add(new OtherPerson("George", IsoChronology.INSTANCE.date(1991, 8, 13), OtherPerson.Sex.MALE, "[email protected]"));
members.add(new OtherPerson("Bob", IsoChronology.INSTANCE.date(2000, 9, 12), OtherPerson.Sex.MALE, "[email protected]"));
Map<Integer, List<Person>> collect = members.stream().collect(groupingBy(Person::getAge));
Map<Integer, List<String>> result = new HashMap<>();
collect.keySet().forEach(key -> {
result.put(key, collect.get(key).stream().map(Person::getName).collect(toList()));
});
Nicht ideal, und für den Willen zu lernen, ich würde gerne eine mehr elegante und leistungsstarke Lösung.
InformationsquelleAutor lcardito | 2015-10-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die Gruppierung einen Stream mit
Sammler.groupingBy
, können Sie eine Reduktion Betrieb die Werte, auf die mit einem benutzerdefiniertenCollector
. Hier müssen wir mitSammler.mapping
, die eine Funktion (was das mapping) und einem Kollektor (wie sammeln Sie die zugeordneten Werte). In diesem Fall wird die ZuordnungPerson::getName
, d.h. eine Methode verweisen, die gibt den Namen der Person, und die wir sammeln, in eineList
.InformationsquelleAutor Tunaki
Können Sie auch Sammler.toMap und bieten mapping für Schlüssel -, Wert-und merge-Funktion(falls vorhanden).
InformationsquelleAutor AnException
Können Sie eine
mapping
Collector
zum anzeigen der Liste derPerson
um eine Liste von person-Namen :InformationsquelleAutor Eran