26 января 2020
Тэги: Collections, Java, Stream API.
Предположим, у нас есть дата начала dateTill и дата окончания dateFrom некоторого временного диапазона. И нам нужно получить список, содержащий все даты из этого диапазона. Как это сделать? Есть два варианта.
Если у вас Java версии 9 или более поздняя, то можно использовать такой лаконичный вариант:
Метод LocalDate.datesUntil() порождает поток, начинающийся с указанной даты и заканчивающийся датой, переданной в этот метод в качестве параметра. Чтобы конечная дата также попала в выборку, прибавляем к ней ещё один день с помощью метода plusDays(). В конце превращаем этот поток в список, используя метод collect().
Если вам «повезло» и у вас Java 8, нужно написать чуть больше кода:
Сначала вычислим количество дней между указанными датами, используя перечисление ChronoUnit. Оно содержит различные единицы измерения времени: миллисекунды, секунды, минуты, часы, месяцы и даже года. Каждая из этих единиц поддерживает метод between(), который возращает количество единиц времени между двумя датами, включая дату начала и исключая дату окончания. Мы добавляем единицу, чтобы также включить дату окончания.
Затем формируем поток целых чисел, начинающийся с нуля и определяем правило формирования следующего элемента. В нашем случае это приращение i + 1. Мы получаем бесконечный поток целых чисел, поэтому ограничиваем его с помощью метода limit(). А метод mapToObj() создаёт сами объекты нужных нам дат, прибавляя к дате начала количество дней, равное текущему элементу потока. В конце собираем всё это в стандартный список.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, H2, Linux, Hibernate, Collections, Stream API, многопоточность, чат-боты, нейросети, файлы, devops, Docker, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.