java-8 - Streams, die Karte und count distinct
Mein Erster Versuch mit java-8-streams...
Ich ein Objekt, das Gebot, das entspricht einem Gebot von einem Benutzer für ein Objekt in einer Auktion. ich habe eine Liste von geboten, und ich möchte, um eine Karte, die zählt, wie viele (verschiedene) - Auktionen der user ein Gebot gemacht.
dies ist mein nehmen auf Sie:
bids.stream()
.collect(
Collectors.groupingBy(
bid -> Bid::getBidderUserId,
mapping(Bid::getAuctionId, Collectors.toSet())
)
).entrySet().stream().collect(Collectors.toMap(
e-> e.getKey(),e -> e.getValue().size())
);
Funktioniert es, aber ich fühle mich, als würde ich Cheaten, weil ich stream der Eintrag legt die Karte, anstatt das zu tun, eine manipulation, die auf den ersten stream... muss ein richtiger Weg, dies zu tun, aber ich konnte nicht es herausfinden...
Dank
- Können Sie Ihre Erklärung der Gebote für ein Objekt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie durchführen
groupingBy
zweimal:Diese Art und Weise haben Sie, wie viele Angebote jeder Benutzer hat in jeder Auktion. Also die Größe der internen Karte ist die Anzahl der Auktionen der Benutzer teilgenommen hat. Wenn Sie nicht brauchen, die zusätzliche Informationen, können Sie dies tun:
Dies ist genau das, was Sie brauchen: Zuordnung von Nutzern zu Anzahl der Auktionen user teilgenommen.
Update: es gibt auch ähnliche Lösung, die näher an deinem Beispiel:
collectingAndThen
Methode, die ich konnte nicht herausfinden, wie zu bedienen. Vielen Dank 🙂Tagir Valeev s Antwort ist die richtige (+1). Hier ist eine weitere, die genau das gleiche tut Sie mit Ihren eigenen downstream-Kollektor für die groupBy: