Trong câu trả lời này, tôi sẽ chỉ ra điều gì xảy ra nếu bạn có Acác yếu tố lặp lại trong List<A> listofAdanh sách của mình .
Trên thực tế, nếu có các bản sao trong listofA, đoạn mã sau sẽ đưa ra IllegalStateException:
Map<A, Collection<B>> resultMap = listofA.stream()
.collect(Collectors.toMap(
Function.identity(),
repo::getListofB);
Ngoại lệ có thể bị ném vì Collectors.toMapkhông biết cách hợp nhất các giá trị khi có xung đột trong các khóa (nghĩa là khi chức năng ánh xạ khóa trả về các bản sao, vì đó sẽ là trường hợp Function.identity()nếu có các phần tử lặp lại trong listofAdanh sách).
Điều này được nêu rõ trong các tài liệu :
Nếu các khóa được ánh xạ chứa các bản sao (theo Object.equals(Object)), một khóa IllegalStateExceptionsẽ được ném khi thao tác thu thập được thực hiện. Nếu các phím được ánh xạ có thể có trùng lặp, sử dụng toMap(Function, Function, BinaryOperator) thay vào đó.
Các tài liệu cũng cung cấp cho chúng tôi giải pháp: trong trường hợp có các yếu tố lặp lại, chúng tôi cần cung cấp một cách để hợp nhất các giá trị. Đây là một cách như vậy:
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;
});
Điều này sử dụng phiên bản quá tải của Collectors.toMapchấp nhận hàm hợp nhất làm đối số thứ ba của nó. Trong hàm hợp nhất, Collection.addAllđang được sử dụng để thêm các Bphần tử của mỗi Aphần tử lặp lại vào danh sách unueue cho mỗi phần tử A.
Trong hàm ánh xạ giá trị, một cái mới ArrayListđược tạo ra, sao cho bản gốc List<B>của mỗi cái Akhông bị đột biến. Ngoài ra, khi chúng tôi tạo một Arraylist, chúng tôi biết trước rằng nó có thể bị đột biến (nghĩa là chúng tôi có thể thêm các yếu tố vào sau, trong trường hợp có các bản sao trong listofA).
Acác yếu tố lặp đi lặp lại trong của bạnList<A>?