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, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.