如何使用Java 8中的函数映射将Map <k,v1>转换为另一个Map <k,v2>?

时间:2016-01-13 11:49:55

标签: java java-8 java-stream

我想使用Java 8中的函数映射将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)); ,在两个映射中将数据与按键匹配的函数进行匹配。您可以假设两个地图都具有相同的键。

我尝试了以下方法:

{{1}}
  

预期结果:{A = 16,B = 10,C = 17}。

是否有更简单的表达方式&#34; 将变换器的地图应用于按键匹配的inputData地图&#34;在Java Streams API中?

3 个答案:

答案 0 :(得分:18)

您可以直接在收藏家中进行转换:

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));

答案 1 :(得分:2)

您也可以从transformers地图本身开始,这看起来更容易:

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

答案 2 :(得分:2)

如果额外的一行不打扰你,请尝试

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