Список с внутренним списком для сопоставления Java Stream Api - PullRequest
0 голосов
/ 06 марта 2019

У меня есть список элементов:

List<OuterElement> outerElements;

Объект OuterElement имеет 2 свойства:

String key;

List<InnerElement> innerElements;

Объект InnerElement имеет 1 свойство:

String value;

Iнужно создать карту, где для каждого innerElement будет создана запись, где ключом будет ключ externalElement, а значением будет значение innerElement;

Map<String, String> // actually Map<OuterElement.key, InnerElement.value> 

Как это сделать с помощью Stream API?

Я пробовал что-то подобное, но это не работает:

       Map<String, String> result = outerElements.stream()
        .forEach(outerElement -> outerElement.getInnerElements().stream().collect(Collectors.toMap(OuterElement::getKey, InnerElement::getValue));

1 Ответ

0 голосов
/ 06 марта 2019

В дополнение к Руслану ответу по java 8 вы можете использовать этот:

    Map<String, List<String>> collect = elements.stream()
        .collect(Collectors.groupingBy(OuterElement::getKey,
            Collectors.collectingAndThen(Collectors.toList(), outers -> outers.stream()
                .flatMap(o -> o.getInnerElements().stream())
                .map(InnerElement::getValue)
                .collect(Collectors.toList()))));

если бы вы могли использовать что-то вроде MultiValueMap :

    MultiValueMap<String, String> map = elements.stream()
        .collect(Collectors.groupingBy(OuterElement::getKey,
            LinkedMultiValueMap::new,
            Collectors.collectingAndThen(Collectors.toList(), outers -> outers.stream()
                .flatMap(o -> o.getInnerElements().stream())
                .map(InnerElement::getValue)
                .collect(Collectors.toList()))));
...