【问题标题】:How to take child of child value and collect as a map with Java Stream operator如何使用 Java Stream 运算符获取子值的子元素并作为地图收集
【发布时间】:2020-04-14 11:07:22
【问题描述】:
我有以下课程。
Class Person {
String value1;
List<KeyValue> keyValue;
}
Class KeyValue{
String key;
String value;
}
我希望输出映射为Map<String, String>,其中第一个字符串值 - Key 是 keyValue.getValue(),它将始终是唯一的,第二个字符串值 - value 是 value1 .
我可以简单地迭代并执行性能,但是有什么方法可以使用 Stream 运算符来做到这一点并使代码可读格式。
【问题讨论】:
标签:
java
list
collections
java-8
java-stream
【解决方案1】:
对于给定Person 的每个KeyValue,创建一个映射条目。然后使用flatMap 运算符将所有这些流扁平化为一个大流。最后,使用toMap 收集器将其收集到地图中。鉴于KeyValue.getValue 返回的值始终是唯一的(根据您的问题陈述),可能不会发生密钥冲突。这是它的外观。
Map<String, String> keyToPersonMap = people.stream()
.flatMap(p -> p.getKeyValue().stream()
.map(kv -> new AbstractMap.SimpleEntry<>(kv.getValue(), p.getValue1())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));