Was ist der Unterschied zwischen Gruppierung und Zuordnung in Collectors (Java)?

8

Sehen Sie sich diesen Code an.

%Vor%

Ist groupingBy und Mapping austauschbar? Was sind ihre Unterschiede?

Würde ich für den dritten Parameter in collect () den gleichen Ausgabetyp Map erhalten, wenn ich Collectors.toList () anstelle von Collectors.toSet () verwende? Ich habe gehört, dass toList () eine beliebte Option ist.

    
NoMoreErrors 27.11.2016, 06:40
quelle

2 Antworten

9
  

Ist groupingBy und Mapping austauschbar?

Nein, sie sind völlig verschieden. Mit groupingBy können Sie ein Map erstellen, wobei der Schlüssel das erste an groupingBy übergebene Argument ist und der Wert ein List des Elementtyps von Stream ist.

Collectors.groupingBy(Item::getPrice) würde ein Map<BigDecimal, List<Item>> generieren (unter der Annahme, dass Item::getPrice eine BigDecimal zurückgibt. Übergeben Sie mapping Collector als Argument an Collectors.groupingBy() , können Sie den Wert der Ausgabekarte ändern (in In Ihrem Beispiel ändern Sie es in Set<String> ).

  

Würde ich für den dritten Parameter in collect () den gleichen Ausgabetyp Map erhalten, wenn ich Collectors.toList () anstelle von Collectors.toSet () verwenden würde?

Nein, Sie erhalten Map<BigDecimal, List<String>> .

    
Eran 27.11.2016 06:43
quelle
7

Nein, die beiden sind völlig verschieden.

Collectors.groupingBy verwendet eine Funktion, die Schlüssel erstellt und einen Kollektor zurückgibt, der eine Zuordnung von Schlüsseln zu Auflistungen von Objekten im Datenstrom mit demselben Schlüssel zurückgibt.

Collectors.mapping dagegen nimmt eine Funktion und einen anderen Kollektor und erzeugt einen neuen Kollektor, der zuerst die Funktion anwendet und dann die zugeordneten Elemente unter Verwendung der gegebenen Kollektoren sammelt. Somit sind die folgenden gleichwertig:

%Vor%

Collectors.mapping ist am nützlichsten in Situationen, in denen Sie keinen Stream haben, aber Sie müssen einen Collector direkt übergeben. Ein Beispiel für eine solche Situation ist die Verwendung von Collectors.groupingBy .

%Vor%

ergibt Map<BigDecimal,Set<Item>> (unter der Annahme, dass getPrice() eine BigDecimal zurückgibt). Jedoch,

%Vor%

gibt Map<BigDecimal,Set<String>> zurück. Bevor die Objekte gesammelt werden, wendet sie Item.getName auf sie an.

    
Hoopje 27.11.2016 09:09
quelle