首页 > 解决方案 > 如何使用 Java Stream 运算符获取子值的子值并作为地图收集

问题描述

我有以下课程。

Class Person {
    String value1;
    List<KeyValue> keyValue;
}
Class KeyValue{
    String key;
    String value;
}

我希望输出映射为Map<String, String>第一个字符串值 -键是 keyValue.getValue(),它将始终是唯一的,第二个字符串值 -值是 value1

我可以简单地迭代并执行性能,但是有什么方法可以使用 Stream 运算符来执行此操作并使代码可读格式。

标签: javalistcollectionsjava-8java-stream

解决方案


对于KeyValue给定的每个Person,创建一个映射条目。然后使用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));

推荐阅读