Java Lambdas многократное суммирование - PullRequest
4 голосов
/ 01 марта 2020

У меня есть класс -

public class LocationStats {

    private String state;
    private String country;
    private int latestTotalCases;
    private int diffFromPrevDay;
    private int diffFromPrev2Day;
    private int diffFromPrev3Day;
}

Top Суммируйте общее количество дел для страны, которую я использовал ниже фрагмента, который работает нормально.

List<LocationStats> newStats= getData(); 
    Map<String, Integer> collect = 
                    newStats
                    .stream()
                    .collect(Collectors.groupingBy(LocationStats::getCountry, Collectors.summingInt(LocationStats::getLatestTotalCases)));

Я хочу подвести итог до 3 других атрибутов при обработке вышеупомянутого фрагмента. Является ли это возможным ? Есть ли Лямбда-элегантный способ добиться этого?

1 Ответ

5 голосов
/ 01 марта 2020

Вы можете использовать Collectors.toMap с функцией слияния.

Например:

Map<String,LocationStats> sums =
    newStats.stream()
            .collect(Collectors.toMap(LocationStats::getCountry,
                                      Function.identity(),
                                      (s1,s2)->new LocationStats(s1,s2)));

Вам нужно будет создать конструктор LocationStats, который будет принимать два экземпляра LocationStats и создает экземпляр, который содержит суммы свойств этих двух экземпляров:

public LocationStats (LocationStats s1, LocationStats s2)
{
    this.state = s1.state;
    this.country = s1.country;
    this.latestTotalCases = s1.latestTotalCases + s2.latestTotalCases;
    this.diffFromPrevDay = s1.diffFromPrevDay + s2.diffFromPrevDay;
    this.diffFromPrev2Day = s1.diffFromPrev2Day + s2.diffFromPrev2Day;
    this.diffFromPrev3Day = s1.diffFromPrev3Day + s2.diffFromPrev3Day;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...