Lambda & Stream: собирать на карте - PullRequest
0 голосов
/ 10 октября 2018

Я хотел бы построить Карту, используя пару Stream & Lambda.

Я пробовал много способов, но застрял.Вот классический Java-код, который делает это, используя как Stream / Lambda, так и классические циклы.

Map<Entity, List<Funder>> initMap = new HashMap<>();
List<Entity> entities = pprsToBeApproved.stream()
    .map(fr -> fr.getBuyerIdentification().getBuyer().getEntity())
    .distinct()
    .collect(Collectors.toList());

for(Entity entity : entities) {
    List<Funder> funders = pprsToBeApproved.stream()
        .filter(fr -> fr.getBuyerIdentification().getBuyer().getEntity().equals(entity))
        .map(fr -> fr.getDocuments().get(0).getFunder())
        .distinct()
        .collect(Collectors.toList());
    initMap.put(entity, funders);
        }

Как видите, я знаю только, как собирать в списке, но я просто не могу сделать то же самоес картой.Вот почему я должен снова передать свой список, чтобы создать второй список, чтобы, наконец, собрать все вместе на карте.Я также попытался использовать оператор collect.groupingBy, так как он также должен создать карту, но мне это не удалось.

1 Ответ

0 голосов
/ 10 октября 2018

Кажется, вы хотите отобразить все, что в списке pprsToBeApproved, на ваши Funder экземпляры, сгруппировав их по покупателю Entity.

Вы можете сделать это следующим образом:

Map<Entity, List<Funder>> initMap = pprsToBeApproved.stream()
    .collect(Collectors.groupingBy(
        fr -> fr.getBuyerIdentification().getBuyer().getEntity(), // group by this
        Collectors.mapping(
            fr -> fr.getDocuments().get(0).getFunder(), // mapping each element to this
            Collectors.toList())));                     // and putting them in a list

Если вам не нужны дублирующие спонсоры для конкретной сущности, вы можете вместо этого собрать карту наборов:

Map<Entity, Set<Funder>> initMap = pprsToBeApproved.stream()
    .collect(Collectors.groupingBy(
        fr -> fr.getBuyerIdentification().getBuyer().getEntity(),
        Collectors.mapping(
            fr -> fr.getDocuments().get(0).getFunder(),
            Collectors.toSet())));

При этом используется Collectors.groupingBy вместе с Collectors.mapping.

...