Gruppierung nach und Kartenwert

Lesezeit: 3 Minuten

Benutzeravatar von doublemc
Doppelmc

Ich versuche, eine Gruppierung nach (zuzuordnen) durchzuführen und dann die Werteliste in eine andere Liste umzuwandeln.

Ich habe eine DistriktlisteDokumente:

List<DistrictDocument> docs = new ArrayList<>();

Dann streame ich darüber und gruppiere es nach Stadt:

Map<String, List<DistrictDocument>> collect = docs.stream()
                .collect(Collectors.groupingBy(DistrictDocument::getCity));

Ich habe auch eine Methode, die DistrictDocument nimmt und daraus Slugable erstellt:

private Fizz createFizz(DistrictDocument doc) {
    return new Fizz().name(doc.getName()).fizz(doc.getFizz());
}

Gibt es eine Möglichkeit, diese Methode in meinen obigen Stream einzufügen, damit ich sie bekomme Map<String, List<Fizz>> ? Ich habe versucht, groupingBy ein zweites Argument hinzuzufügen, konnte aber keinen richtigen Weg finden und habe immer Kompilierungsfehler erhalten.

Bearbeiten: Was ist, wenn mein createFizz zurückkehrt? List<Fizz> ? Gibt es eine Option, diese Liste in Collectors.mapping zu glätten, weil ich sie immer noch haben möchte Map<String, List<Fizz>> anstatt Map<String, List<List<Fizz>>>

Benutzeravatar von Eran
Eran

Sie müssen a verketten Collectors.mapping() Sammler zum Collectors.groupingBy() Kollektor:

Map<String, List<Fizz>> collect =
    docs.stream()
        .collect(Collectors.groupingBy(DistrictDocument::getCity,
                 Collectors.mapping(d->createFizz(d),Collectors.toList())));

Wenn createFizz(d) würde a zurückgeben List<Fizzkönnen Sie es mit Java 9 reduzieren Collectors.flatMapping:

Map<String, List<Fizz>> collect =
    docs.stream()
        .collect(Collectors.groupingBy(DistrictDocument::getCity,
                 Collectors.flatMapping(d->createFizz(d).stream(),Collectors.toList())));

Wenn Sie Java 9 nicht verwenden können, verwenden Sie vielleicht Collectors.toMap wird helfen:

Map<String, List<Fizz>> collect =
    docs.stream()
        .collect(Collectors.toMap(DistrictDocument::getCity,
                                  d->createFizz(d),
                                  (l1,l2)->{l1.addAll(l2);return l1;}));

  • d->createFizz(d) Dazu können Sie eine Methodenreferenz verwenden. Zugegebenermaßen kennen wir die Klasse nicht.

    – Michael

    28. Februar 2018 um 12:25 Uhr

  • @Michael ja, die Klasse nicht zu kennen war der Hauptgrund, warum ich keine Methodenreferenz verwendet habe.

    – Eran

    28. Februar 2018 um 12:26 Uhr

  • Könnten Sie meine Bearbeitung überprüfen? Leider muss createFizz List zurückgeben, und ich kann anscheinend keinen Weg finden, diese Liste zu glätten.

    – Doppelmc

    28. Februar 2018 um 12:40 Uhr

  • @doublemc Ich glaube Java 9 hat Collectors.flatMapping, also kannst du schreiben Collectors.flatMapping(d->createFizz(d).stream(),Collectors.toList())));

    – Eran

    28. Februar 2018 um 12:41 Uhr

  • Was ist, wenn ich nur Java 8 verwenden kann? Irgendeine Möglichkeit, das zu tun?

    – Doppelmc

    28. Februar 2018 um 12:43 Uhr

Falls Sie eine doppelt verschachtelte Gruppierung durchführen möchten:

Nehmen wir an, Sie haben eine Sammlung von EducationData Objekte, die den Namen der Schule, des Lehrers und des Schülers enthalten. Aber Sie möchten eine verschachtelte Karte, die wie folgt aussieht:

Was du hast

class EducationData {
     String school;
     String teacher;
     String student;

     // getters setters ...
}

Was Sie wollen

Map<String, Map<String, List<String>>> desiredMapOfMpas ...

// which would look like this :

"East High School" : {
     "Ms. Jackson" : ["Derek Shepherd", "Meredith Grey", ...],
     "Mr. Teresa" : ["Eleanor Shellstrop", "Jason Mendoza", ...],
     ....
}

Wie man dorthin kommt

import static java.util.stream.Collectors.*;

public doubleNestedGroup(List<EducationData> educations) {
     Map<String, Map<String, List<String>>> nestedMap = educations.stream()
        .collect(
             groupingBy(
                  EducationData::getSchool,
                  groupingBy(
                       EducationData::getTeacher,
                       mapping(
                            EducationData::getStudent,
                            toList()
                       )
                  )
              )
        );
}

1449820cookie-checkGruppierung nach und Kartenwert

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy