Java Stream Grouping собирать в пользовательский объект - PullRequest
0 голосов
/ 10 января 2019

у меня температурный класс

class Temperature {
    double minTemp;
    double maxTemp;
    String city;
    String country;
}

У меня есть другой класс, который поддерживает коллекцию температуры

class Temperatures {
    List<Temperature> temperatures;
}

Я хочу сгруппировать температуры по стране, используя потоки.

То, что я хочу, это

public Map<String, Temperatures> temperaturesByCountry()

Но я не могу получить Температуры в качестве значения карты, используя поток, я получаю Список температур.

Моя реализация groupingBy следующая

Map<String, List<Temperature>> result = this.getTemperatures()
                .stream()
                .collect(Collectors.groupingBy(Temperature::getCountry));

Я хочу получить Map<String, Temperatures> вместо Map<String, List<Temperature>>

Как мне этого добиться ??

Ответы [ 2 ]

0 голосов
/ 10 января 2019

В качестве альтернативы, вы могли бы объединить Map.forEach с существующей информацией как:

Map<String, Temperatures> temperaturesByCountry = new HashMap<>();
Map<String, List<Temperature>> result = this.getTemperatures()
        .stream()
        .collect(Collectors.groupingBy(Temperature::getCountry));
result.forEach((k, v) -> temperaturesByCountry.put(k, new Temperatures(v)));
0 голосов
/ 10 января 2019

Если у вас есть конструктор Temperatures(List<Temperature> temperatures) это должно сделать трюк:

Map<String, Temperatures> result = 
       this.getTemperatures()
           .stream()
           .collect(groupingBy(Temperature::getCountry, 
                               collectingAndThen(toList(), Temperatures::new)));
...