gpt4 book ai didi

java - 如何在为不包含重复项的项目指定特定逻辑的同时连接两个 Java 流?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:32:17 25 4
gpt4 key购买 nike

我有两个使用相同对象作为键的 map 。我想按键合并这两个流。当两个 map 中都存在一个键时,我希望生成的 map 运行一个公式。当单个映射中存在键时,我希望该值为 0。

Map<MyKey, Integer> map1;
Map<MyKey, Integer> map2;

<Map<MyKey, Double> result =
Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
.collect(Collectors.toMap(
Map.Entry::getKey, Map.Entry::getValue,
(val1, val2) -> (val1 / (double)val2) * 12D));

如果键存在于两个映射中,这将使用公式,但我需要一种简单的方法来将仅存在于两个映射之一中的键的值设置为 0D。

我可以通过集合数学并尝试计算两个键集的内连接,然后从它们的完整外连接中减去内连接结果来做到这一点……但这需要大量工作感觉没必要。

是否有更好的方法,或者我可以使用 Streaming API 轻松完成的事情?

最佳答案

这里有一个简单的方法,只流式传输键,然后查找值,并保持原始映射不变。

Map<String, Double> result =
Stream.concat(map1.keySet().stream(), map2.keySet().stream())
.distinct()
.collect(Collectors.toMap(k -> k, k -> map1.containsKey(k) && map2.containsKey(k)
? map1.get(k) * 12d / map2.get(k) : 0d));

测试

Map<String, Integer> map1 = new HashMap<>();
Map<String, Integer> map2 = new HashMap<>();
map1.put("A", 1);
map1.put("B", 2);
map2.put("A", 3);
map2.put("C", 4);
// code above here
result.entrySet().forEach(System.out::println);

输出

A=4.0
B=0.0
C=0.0

关于java - 如何在为不包含重复项的项目指定特定逻辑的同时连接两个 Java 流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49184887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com