Как сделать суммирование вводимых в HashMap значений Java?

У меня есть список с объектами, содержащими LocaleDateTime и int. Я хочу раскидать значения по ключам в цикле, не проверяя, есть ли в Map такой ключ. Если нет, то он создаётся с переданным значением, а если есть, то к предыдущему значению по этому ключу прибавляется новое. Каким методом можно реализовать такое?

Сейчас код выглядит вот так:

Map<LocalDate, Integer> caloriesPerDate = new HashMap<>();
        for (UserMeal userMeal : meals) {
            LocalDate key = LocalDate.from(userMeal.getDateTime());
            int calories = userMeal.getCalories();

            if (caloriesPerDate.containsKey(key)) caloriesPerDate.put(key, caloriesPerDate.get(key) + calories);
            else caloriesPerDate.put(key, calories);
        }

Хотелось бы сократить его и сделать более изящным.


Ответы (2 шт):

Автор решения: dmitry1902

попробуйте метод merge. Для вашего примера можно написать так:

Map<LocalDate, Integer> caloriesPerDate = new HashMap<>();
meals.forEach(m ->
    caloriesPerDate.merge(m.date.toLocalDate(), m.calories, (value, newValue) -> value + newValue)
);
→ Ссылка
Автор решения: IlnurGibadullin

Можно реализовать через Stream API, например:

Map<LocalDate, Integer> caloriesPerDate = meals.stream()
            .collect(
                Collectors.toMap(UserMeal::getDateTime, UserMeal::getCalories, Integer::sum)
            );

UPD:

Map<LocalDate, Integer> caloriesPerDate = meals.stream()
            .collect(
                Collectors.toMap(meal -> meal.getDateTime.toLocalDate(), UserMeal::getCalories, Integer::sum)
            );
→ Ссылка