Как сделать суммирование вводимых в 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)
);