Исправление ошибок карты дубликатов ключей с использованием потоков в Java 8 - PullRequest
1 голос
/ 07 ноября 2019

Я получаю ошибку PublicException: Duplicate Keys в этом месте.

Map<BgwContract, List<Fee>> bgwContractFeeMap = bgwContractList
            .stream()
            .filter(bgwContract -> !bgwContract.getStatus().equals(BgwContractStatus.CLOSED))
            .filter(bgwContract -> availableIbans.contains(bgwContract.getFeeAccount()))
            .collect(
                    Collectors.toMap(bgwContract -> bgwContract,
                                     bgwContractFeeService::getContractMonthlyFees)
            );

Я понимаю, что проблема в том, что есть некоторые дубликаты, и он сразу вылетает. Я знаю, что .distinct() исправит эту ошибку, но я не хочу потерять какие-либо данные. Есть ли способ, как улучшить это отображение, чтобы исправить эту ошибку без потери каких-либо значений, может быть, какой-то фильтр или любой другой метод Java 8? Я не говорю о MultiMaps и т. Д.

1 Ответ

1 голос
/ 07 ноября 2019

Вам необходимо передать функцию слияния в Collectors.toMap(), которая обрабатывает значения, имеющие одинаковый ключ:

Map<BgwContract, List<Fee>> bgwContractFeeMap = bgwContractList
            .stream()
            .filter(bgwContract -> !bgwContract.getStatus().equals(BgwContractStatus.CLOSED))
            .filter(bgwContract -> availableIbans.contains(bgwContract.getFeeAccount()))
            .collect(
                    Collectors.toMap(Function.identity(),
                                     bgwContractFeeService::getContractMonthlyFees,
                                     (l1,l2)->{
                                         l1.addAll(l2);
                                         return l1;
                                      })
            );

В этом случае элементы двух списков значений, имеющих одинаковый ключ, будут объединены водин список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...