Карта ha sh не будет работать для вашего варианта использования. HashMap помогает найти соответствующее значение по ключу. Например, вы можете создать HashMap, который предоставит вам соответствующие данные о погоде для одной даты. Но вы не можете использовать HashMap для ответа на запрос «предоставьте мне все данные о погоде между этими двумя датами» без итерации по диапазону дат. И это то, что вам нужно для ваших методов avarageTemperatures
и approvedValues
.
Вместо этого вы можете использовать TreeMap
. Это потребует изменения вашей программы в нескольких местах.
Объявление переменной:
private List<Weather> weatherData = new ArrayList<>();
Должно стать:
private NavigableMap<LocalDate, List<Weather>> weatherData = new TreeMap<>();
Это "карта из date в список данных о погоде ", потому что для каждой даты существует более одного элемента данных. Если вы можете это изменить, это будет проще.
Далее вместо использования weatherData.add(weather)
вам нужно использовать:
weatherData.computeIfAbsent(date, key -> new ArrayList<>()).add(weather);
Опять же, это более сложно, потому что может быть больше чем один элемент на дату.
Наконец, где вы получаете доступ к данным через итерацию:
weatherData.stream().filter(weather -> !weather.getDate().isAfter(dateTo) && !weather.getDate().isBefore(dateFrom))
Вместо этого вы могли бы использовать метод subMap
, который напрямую ищет ключевой диапазон:
weatherData.subMap(dateFrom, dateTo).values().stream().flatMap(List::stream)