如果不存在来自另一个地图的键,如何将元素添加到地图

时间:2019-07-04 18:42:58

标签: java java-stream

我有一个流,它接收一个对象列表,并通过按ID对它们进行分组并计算每个元素的重复次数来创建映射。 但是,在关闭流并返回地图之前,我需要检查另一张地图(我已经拥有)中的所有ID(键)是否已存在于新地图中,如果没有,则必须添加默认值0。 在同一流中进行这样的操作非常重要,因为我正在尝试学习并且真的想使代码尽可能紧凑和可读。

以下是代码的第一部分,我现在需要检查另一个映射中的哪些ID在创建的新ID中不存在,并将其添加为0。

return bookings.stream()
        .collect(Collectors.groupingBy(a -> a.getID(), Collectors.counting()));

编辑:

为了澄清,这是我需要做的,但是我想在原始流中执行以下所有操作。

Map<Integer,Long> res = bookings.stream()
        .collect(Collectors.groupingBy(a -> a.getID(), Collectors.counting()));
map2.keySet().stream().forEach(r -> res.putIfAbsent(r,0L));
return res;

1 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点,但是“使代码尽可能紧凑和可读” 几乎是不可能的。您可能要查看的一种解决方案是Collectors.collectingAndThen()。使用此收集器,可以将整理器添加到给定的收集器。因此您可以对整理器中的所有键运行Map.putIfAbsent()

Map<Integer, Long> result = bookings.stream()
        .collect(Collectors.collectingAndThen(
                Collectors.groupingBy(Booking::getCampoID, Collectors.counting()),
                map -> {
                    map2.keySet().forEach(k -> map.putIfAbsent(k, 0L));
                    return map;
                }));

但是实际上,您已经拥有的代码对我来说也非常紧凑和可读。