简体   繁体   English

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

[英]List with inner List to Map Java Stream Api

I have a list of elements:我有一个元素列表:

List<OuterElement> outerElements;

OuterElement object has 2 property: OuterElement 对象有 2 个属性:

String key;

List<InnerElement> innerElements;

InnerElement object has 1 property: InnerElement 对象有 1 个属性:

String value;

I need to create a map where for each innerElement will be created an Entry, where key will be outerElement key, and value will be innerElement value;我需要创建一个映射,其中为每个innerElement 创建一个条目,其中key 将是outerElement 键,value 将是innerElement 值;

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

How to do it using Stream API?如何使用 Stream API 做到这一点?

I have tried something like this, but it doesn't work:我试过这样的事情,但它不起作用:

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

In addition to Ruslan answer for java 8 you could use this one:除了 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()))));

if you could use something like MultiValueMap :如果您可以使用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()))));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM