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

标签 java collections java-8 java-stream

我有两个使用相同对象作为键的 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/

相关文章:

java - 如何在java网络中广播

java - 如何获得不可修改的 LinkedHashSet

java - 为 Headers 匹配 PHP 中的任何 PHP header() 标签

java - 两个日期值之间具有精确的差值

java - 为什么这个 SimpleDateFormat 不能解析这个日期字符串?

java - 使用干净的代码基于 "template" HashMap 动态创建 HashMap

java - 为什么 Collections.copy 操作适用于列表的大小而不是列表的容量?

java - 如何使用 LocalDateTime 解析/格式化日期? (Java 8)

java - 分组,按类型求和,然后使用 Java 流获取差异

java - JDK8 中的动态数组