Java 如果其他贴图中的关键点不存在,如何向贴图添加元素
我有一个流,它获取一个对象列表,并通过按ID对它们进行分组并计算每个元素的重复次数来创建一个映射。 但是,在关闭流并返回映射之前,我需要检查来自另一个映射(我已经拥有)的所有ID(键)是否存在于新映射中,如果不存在,我必须使用默认值0添加它们。 在同一个流中执行这样的操作是很重要的,因为我正在努力学习,并且非常希望使代码尽可能紧凑和可读 下面是代码的第一部分,我现在需要检查其他映射中的哪些ID不存在于新创建的映射中,并使用值0添加它们Java 如果其他贴图中的关键点不存在,如何向贴图添加元素,java,java-stream,Java,Java Stream,我有一个流,它获取一个对象列表,并通过按ID对它们进行分组并计算每个元素的重复次数来创建一个映射。 但是,在关闭流并返回映射之前,我需要检查来自另一个映射(我已经拥有)的所有ID(键)是否存在于新映射中,如果不存在,我必须使用默认值0添加它们。 在同一个流中执行这样的操作是很重要的,因为我正在努力学习,并且非常希望使代码尽可能紧凑和可读 下面是代码的第一部分,我现在需要检查其他映射中的哪些ID不存在于新创建的映射中,并使用值0添加它们 return bookings.stream()
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;
Map res=bookings.stream()
.collect(Collectors.groupingBy(a->a.getID(),Collectors.counting());
map2.keySet().stream().forEach(r->res.putIfAbsent(r,0L));
返回res;
有很多方法可以做到这一点,但“使代码尽可能紧凑和可读”几乎是不可能的。您可能希望了解的一个解决方案是收集器。CollectionAndThen()
。使用此收集器,您可以向给定收集器添加一个修整器。因此,您可以对finisher中的所有键运行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;
}));
Map result=bookings.stream()
收集,收集收集,然后收集(
Collectors.groupingBy(Booking::getCampoID,Collectors.counting()),
地图->{
map2.keySet().forEach(k->map.putIfAbsent(k,0L));
返回图;
}));
但实际上,您已经拥有的代码对我来说也是非常紧凑和可读的