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)