我有一个元素列表:
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));
答案 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()))));