簡體   English   中英

如何轉換地圖 <String, List<String> &gt;到地圖 <String, String> 在Java 8功能性API中

[英]How to Convert a Map<String, List<String>> to Map<String, String> in java 8 functional APIs

我有一張下面的地圖,

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

我想使用以下Java 8功能性API將其轉換為另一張地圖,

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

將地圖值展平為條目,然后收集它們:

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來縮短此時間。

不需要構造臨時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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM