Skip to main content
 首页 » 编程设计

filter中Java中Lambda 过滤条件,忽略添加到 map

2025年02月15日11sharpest

我有一张格式图(引用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 收集器。

  1. 提前分析:

    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)))); 
    
  2. 过滤结果:

    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; }));