In dieser Antwort zeige ich, was passiert, wenn Sie AElemente in Ihrer List<A> listofAListe wiederholt haben .
Wenn Duplikate vorhanden listofAwä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.toMapnicht 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 listofAListe wiederholte Elemente enthalten würde ).
Dies ist in den Dokumenten klar angegeben :
Wenn die zugeordneten Schlüssel Duplikate enthalten (gemäß Object.equals(Object)), IllegalStateExceptionwird 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.addAllverwendet, um das hinzuzufügenBAWird Elemente jedes wiederholten Elements für jedes Element in eine eindeutige Liste aufzunehmen A.
In der Value Mapper-Funktion wird eine neue ArrayListerstellt, damit das Original List<B>von jeder Anicht 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).
AElemente in Ihrem wiederholtList<A>?