Trong câu trả lời này, tôi sẽ chỉ ra điều gì xảy ra nếu bạn có A
các yếu tố lặp lại trong List<A> listofA
danh 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.toMap
khô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 listofA
danh 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 IllegalStateException
sẽ đượ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.toMap
chấ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 B
phần tử của mỗi A
phầ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 A
khô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
).
A
các yếu tố lặp đi lặp lại trong của bạnList<A>
?