我有一个流,它接收一个对象列表,并通过按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;
答案 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;
}));
但是实际上,您已经拥有的代码对我来说也非常紧凑和可读。