带有内部列表的列表以映射Java Stream Api

时间:2019-03-06 12:58:53

标签: java java-8 java-stream

我有一个元素列表:

List<OuterElement> outerElements;

OuterElement对象具有2个属性:

String key;

List<InnerElement> innerElements;

InnerElement对象具有1个属性:

String value;

我需要创建一个映射,其中将为每个innerElement创建一个Entry,其中key将为outerElement键,value将为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 :(得分:0)

除了Java 8的Ruslan答案之外,您还可以使用以下答案:

    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()))));