Элегантный и эффективный способ объединить несколько карт в одну - PullRequest
4 голосов
/ 15 мая 2019

У меня есть список карт. Все карты имеют одинаковые ключи. Теперь я хотел бы объединить все карты списка в одну карту, просто суммируя значения для каждого ключа.

Такое ощущение, что должен быть лучший способ сделать это.

// source
public List<Map<Integer, Long>> list_of_maps = new ArrayList<>();

// destination
private Map<Integer, Long> aggr_map = new HashMap<>();


for(Integer i : list_of_maps.iterator().next().keySet()){
    long c = 0;
    for(Map<Integer, Long> map : list_of_maps){
        c += map.get(i).getCount();
    }
    aggr_map.put(i, c);
}

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

1 Ответ

7 голосов
/ 15 мая 2019

Вы можете сделать это так,

Map<Integer, Long> numToSumMap = list_of_maps.stream()
    .flatMap(m -> m.entrySet().stream())
    .collect(Collectors.groupingBy(Map.Entry::getKey, 
        Collectors.summingLong(Map.Entry::getValue)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...