如何转换地图<string,list <string =“”>&gt;在Java 8功能API中映射<string,string =“”>

时间:2017-11-10 01:51:33

标签: java java-8 java-stream

我有一张像bellow一样的地图,

 [key = "car", value = ["bmw", "toyota"]]
 [key = "bike", value = ["honda", "kawasaki"]]

我想使用java 8功能apis将其转换为另一个地图,如bellow,

 [key = "bmw", value = "car"]
 [key = "toyota", value = "car"]
 [key = "honda", value = "bike"]
 [key = "kawasaki", value = "bike"]

2 个答案:

答案 0 :(得分:6)

将地图值展平为条目,然后收集它们:

Map<String, String> m2 = map
    .entrySet()
    .stream()
    .flatMap(e -> e.getValue().stream().map(v -> new AbstractMap.SimpleEntry<>(v, e.getKey())))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

可以通过导入AbstractMap.SimpleEntryMap.Entry来缩短这一点。

答案 1 :(得分:2)

不需要构建临时Map.Entry实例的解决方案是:

Map<String, String> result = source.entrySet().stream()
  .collect(HashMap::new, (m,e)->e.getValue().forEach(k->m.put(k,e.getKey())), Map::putAll);

您可能会注意到与非流解决方案的相似性

Map<String, String> result = new HashMap<>();
source.forEach((key, value) -> value.forEach(k -> result.put(k, key)));

或Java 8之前的解决方案

Map<String, String> result = new HashMap<>();
for(Map.Entry<String,List<String>> e: source.entrySet())
    for(String key: e.getValue()) result.put(key, e.getKey());