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.
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>>
.
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:
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
.
ergibt Map<BigDecimal,Set<Item>>
(unter der Annahme, dass getPrice()
eine BigDecimal
zurückgibt). Jedoch,
gibt Map<BigDecimal,Set<String>>
zurück. Bevor die Objekte gesammelt werden, wendet sie Item.getName
auf sie an.
Tags und Links java java-8 java-stream collectors