2014-09-16 2 views
2

У меня есть карта формата (ссылка Finding average using Lambda (Double stored as String))Java - Лямбда критерии фильтрации, чтобы игнорировать добавление к карте

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 для этой страны пуст?

ответ

2

С Collectors.groupingBy не позволяет пропускать группы, вы должны либо анализировать условие фильтрации заранее, так что вы можете фильтровать перед выполнением groupBy или фильтровать карту после этого (я игнорирую третий вариант, реализовать свой собственный 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; }));