我想使用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中?
答案 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));