package eu.ztsh.lfr.model; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.stream.Collectors; public class Temperatures extends ConcurrentHashMap> { public void addData(DataRow dataRow) { putIfAbsent(dataRow.city(), new ConcurrentHashMap<>()); var city = get(dataRow.city()); city.putIfAbsent(dataRow.year(), new YearDataAccumulator()); city.get(dataRow.year()).add(dataRow.temperature()); } public Averages getAverages() { var computed = entrySet().stream() .map(entry -> { var newEntry = entry.getValue().entrySet().stream() .map(yearEntry -> { var average = new Average(); average.setYear(yearEntry.getKey().toString()); average.setAverageTemperature(yearEntry.getValue().getAverage()); return average; }) .toList(); return Map.entry(entry.getKey(), newEntry); }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); return new Averages(computed); } }