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

taf*_*it3 16 java java-8 java-stream

我想使用Java 8中的函数映射将a转换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));
Run Code Online (Sandbox Code Playgroud)

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

在Java Streams API中是否有更简单的方法表达" 将变换器的映射应用于按键匹配的inputData映射 "?

Tag*_*eev 18

您可以直接在收集器中进行转换:

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

这种解决方案更短,不会产生中间对象.

如果您inputData具有相同的值类型(Map<String, Long>),则可以就地执行转换:

inputData.replaceAll((key, value) -> transformers.get(key).apply(value));
Run Code Online (Sandbox Code Playgroud)