Java 8 Stream API - Auswahl nur Werte nach Sammler.groupingBy(..)

Sagen, ich habe die folgende Sammlung von Student Objekte, die aus dem Namen(String), Alter(int) und Stadt(String).

Ich versuche, mit Java das Stream-API, um die folgenden sql-like behavior:

SELECT MAX(age)
FROM Students
GROUP BY city

Nun, ich fand zwei verschiedene Möglichkeiten, dies zu tun:

final List<Integer> variation1 =
            students.stream()
                    .collect(Collectors.groupingBy(Student::getCity, Collectors.maxBy((s1, s2) -> s1.getAge() - s2.getAge())))
                    .values()
                    .stream()
                    .filter(Optional::isPresent)
                    .map(Optional::get)
                    .map(Student::getAge)
                    .collect(Collectors.toList());

Ist und das andere:

final Collection<Integer> variation2 =
            students.stream()
                    .collect(Collectors.groupingBy(Student::getCity,
                            Collectors.collectingAndThen(Collectors.maxBy((s1, s2) -> s1.getAge() - s2.getAge()),
                                    optional -> optional.get().getAge())))
                    .values();

In beide Richtungen, man muss .values() ... und filter die leeren Gruppen zurückgegeben, die von der collector.

Gibt es eine andere Weise, dieses zu erzielen erforderlich Verhalten?

Diese Methoden erinnern mich an over partition by sql-Anweisungen...

Dank


Edit: Alle Antworten waren wirklich interessant, aber leider ist dies nicht das, was ich gesucht hatte, da das, was ich versuche zu bekommen ist, nur die Werte. Ich brauche nicht den Schlüssel, nur die Werte.

Was meinst du mit "filter die leeren Gruppen"?
Ich meine nicht rufen values() da brauche ich nicht die Tasten an alle
Die Umsetzung muss verwenden Sie die Tasten, um herauszufinden, wie Sie die Gruppe der Elemente. Sie können entsorgen Sie die Tasten danach, aber das bedeutet nicht, Sie brauchen Sie nicht in der Zwischenzeit.

InformationsquelleAutor Ghost93 | 2016-02-29

Schreibe einen Kommentar