簡體   English   中英

如何使用Java 8中的函數映射將Map <K,V1>轉換為另一個Map <K,V2>?

[英]How do I transform a Map<K,V1> to another Map<K,V2> using a map of functions in Java 8?

我想使用Java 8中的函數映射將Map<String, Integer>為另一個Map<String, Long> ,在兩個映射中將數據與按鍵匹配的函數進行匹配。 您可以假設兩個地圖都具有相同的鍵。

我嘗試了以下方法:

Map<String, Integer> inputData = new HashMap<>();
inputData.put("A",8);
inputData.put("B",7);
inputData.put("C",6);

Map<String, Function<Integer, Long>> transformers = new HashMap<>();
transformers.put("A", x -> x*2L);
transformers.put("B", x -> x+3L);
transformers.put("C", x -> x+11L);

Map<String, Long> mappedData = inputData.entrySet().stream()
    .map(entry -> new AbstractMap.SimpleEntry<>(
         entry.getKey(),
         transformers.get(entry.getKey()).apply(entry.getValue())))
    .collect(toMap(Map.Entry::getKey, Map.Entry::getValue));

預期結果:{A = 16,B = 10,C = 17}。

在Java Streams API中是否有更簡單的方法表達“ 將變換器的映射應用於按鍵匹配的inputData映射 ”?

您可以直接在收集器中進行轉換:

Map<String, Long> mappedData = inputData.entrySet().stream()
    .collect(toMap(Map.Entry::getKey, 
            entry -> transformers.get(entry.getKey()).apply(entry.getValue())));

這種解決方案更短,不會產生中間對象。

如果您的inputData具有相同的值類型( Map<String, Long> ),您可以就地執行轉換:

inputData.replaceAll((key, value) -> transformers.get(key).apply(value));

您也可以從transformers地圖本身開始,看起來更容易:

    Map<String, Long> collect = transformers.entrySet().stream()
            .collect(toMap(Map.Entry::getKey, 
                    e -> e.getValue().apply(inputData.get(e.getKey()))));

如果一條額外的線條不打擾你,試試吧

Map<String, Long> result = new HashMap<>(); // this line
inputData.forEach((k, v) -> result.put(k, transformers.get(k).apply(v));

如何轉換列表<object>至 Map<k, v> 使用 java stream<div id="text_translate"><p> 我想將List&lt;ObjectInList&gt;轉換為Map&lt;K, V&gt;</p><pre> class ObjectInList { List&lt;Long&gt; listWithLong; Map&lt;String, Object&gt; dataMap; // there is 'id' key, and i want to use this id as key in map to be converted }</pre><p> 新的 map 格式如下</p><pre>String type; // this type is value of dataMap. List&lt;Long&gt; contents</pre><p> List&lt;Object&gt;中的每個 Object 都可以有重復的類型</p><p>例如</p><pre>///////// before converted //////////// [ { list: [1,2,3], dataMap: { type: "a", } }, { list: [4,5,6], dataMap: { type: "b", } }, { list: [7,8], dataMap: { type: "a", } }, ] ///////////// after converted ////////// { "a": [1,2,3,7,8], "b": [4,5,6] }</pre></div></k,></object>

[英]How to convert LIst<Object> to Map<K, V> with using java stream

暫無
暫無

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

相關問題 在 Java 8 我如何轉換一個 Map<k,v> 給另一個 Map<k,v> 使用 lambda?</k,v></k,v> 你怎么反映地圖 <v1, Set<v2> &gt;到地圖 <v2, Set<v1> &gt;在Java中使用stream() Java:Map.of&lt;&quot;k1&quot;, &quot;v1&quot;&gt; vs Collections.singletonMap(&quot;k1&quot;, &quot;v1&quot;) 如何使用java 8將Stream <Map <K,V >>收集到Map <K,List <V >>中? Java 8轉換地圖 <K, List<V> &gt;到地圖 <V, List<K> &gt; 怎么做地圖<K, V>從流<Tuple2<K, V> &gt; 在 Java 流 API 中? Java 8 列表<V>進入地圖<K, V>帶功能 Java 8 列表<V>進入地圖<K, V> 如何轉換列表<object>至 Map<k, v> 使用 java stream<div id="text_translate"><p> 我想將List&lt;ObjectInList&gt;轉換為Map&lt;K, V&gt;</p><pre> class ObjectInList { List&lt;Long&gt; listWithLong; Map&lt;String, Object&gt; dataMap; // there is 'id' key, and i want to use this id as key in map to be converted }</pre><p> 新的 map 格式如下</p><pre>String type; // this type is value of dataMap. List&lt;Long&gt; contents</pre><p> List&lt;Object&gt;中的每個 Object 都可以有重復的類型</p><p>例如</p><pre>///////// before converted //////////// [ { list: [1,2,3], dataMap: { type: "a", } }, { list: [4,5,6], dataMap: { type: "b", } }, { list: [7,8], dataMap: { type: "a", } }, ] ///////////// after converted ////////// { "a": [1,2,3,7,8], "b": [4,5,6] }</pre></div></k,></object> 如何將值插入Map <K,V>?
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM