In dieser Antwort zeige ich, was passiert, wenn Sie A
Elemente in Ihrer List<A> listofA
Liste wiederholt haben .
Wenn Duplikate vorhanden listofA
wären, würde der folgende Code ein IllegalStateException
:
Map<A, Collection<B>> resultMap = listofA.stream()
.collect(Collectors.toMap(
Function.identity(),
repo::getListofB);
Die Ausnahme wird möglicherweise ausgelöst, da Collectors.toMap
nicht weiß, wie sie zusammengeführt werden soll Werte werden sollen, wenn eine Kollision in den Schlüsseln auftritt (dh wenn die Key Mapper-Funktion Duplikate zurückgibt, wie dies der Fall wäre, Function.identity()
wenn die listofA
Liste wiederholte Elemente enthalten würde ).
Dies ist in den Dokumenten klar angegeben :
Wenn die zugeordneten Schlüssel Duplikate enthalten (gemäß Object.equals(Object)
), IllegalStateException
wird beim Ausführen des Erfassungsvorgangs ein ausgelöst. Wenn die zugeordneten Schlüssel möglicherweise Duplikate enthalten, verwenden SietoMap(Function, Function, BinaryOperator
stattdessen).
Die Dokumente geben uns auch die Lösung: Wenn sich Elemente wiederholen, müssen wir eine Möglichkeit zum Zusammenführen von Werten bereitstellen. Hier ist eine solche Möglichkeit:
Map<A, Collection<B>> resultMap = listofA.stream()
.collect(Collectors.toMap(
Function.identity(),
a -> new ArrayList<>(repo.getListofB(a)),
(left, right) -> {
left.addAll(right);
return left;
});
Dies verwendet die überladene Version Collectors.toMap
, die eine Zusammenführungsfunktion als drittes Argument akzeptiert . Wird innerhalb der Zusammenführungsfunktion Collection.addAll
verwendet, um das hinzuzufügenB
A
Wird Elemente jedes wiederholten Elements für jedes Element in eine eindeutige Liste aufzunehmen A
.
In der Value Mapper-Funktion wird eine neue ArrayList
erstellt, damit das Original List<B>
von jeder A
nicht mutiert wird. Während wir ein erstellen Arraylist
, wissen wir im Voraus, dass es mutiert werden kann (dh wir können später Elemente hinzufügen, falls Duplikate vorhanden sind listofA
).
A
Elemente in Ihrem wiederholtList<A>
?