我有一张格式图(引用Finding average using Lambda (Double stored as String))
Map<String, Double> averages=mapOfIndicators.values().stream()
.flatMap(Collection::stream)
.filter(objectDTO -> !objectDTO.getNewIndex().isEmpty())
.collect(Collectors.groupingBy(ObjectDTO::getCountryName,
Collectors.mapping(ObjectDTO::getNewIndex,
Collectors.averagingDouble(Double::parseDouble))));
我想忽略整个国家/地区映射,即使其中一个国家/地区的 newIndex 值为空?
请您参考如下方法:
由于Collectors.groupingBy
不允许跳过组,因此您必须提前分析过滤条件,以便在执行groupBy
之前进行过滤或在执行之后过滤 map (我忽略第三个选项,实现您自己的 groupingBy
收集器。
提前分析:
Map<String, Boolean> hasEmpty=mapOfIndicators.values().stream() .flatMap(Collection::stream) .collect(Collectors.groupingBy(ObjectDTO::getCountryName, Collectors.mapping(o->o.getNewIndex().isEmpty(), Collectors.reducing(false, Boolean::logicalOr)))); Map<String, Double> averages=mapOfIndicators.values().stream() .flatMap(Collection::stream) .filter(objectDTO -> !hasEmpty.get(objectDTO.getCountryName())) .collect(Collectors.groupingBy(ObjectDTO::getCountryName, Collectors.mapping(ObjectDTO::getNewIndex, Collectors.averagingDouble(Double::parseDouble))));
过滤结果:
Map<String, Double> averages=mapOfIndicators.values().stream() .flatMap(Collection::stream) .collect(Collectors.collectingAndThen( Collectors.groupingBy(ObjectDTO::getCountryName, Collectors.mapping(ObjectDTO::getNewIndex, Collectors.averagingDouble( s->s.isEmpty()? Double.NaN: Double.parseDouble(s)))), m->{ m.values().removeIf(d->Double.isNaN(d)); return m; }));