TemporalQuery — это стандартный способ запроса временных объектов(LocalDate, LocalDateTime и т. д.) для принятия лучших бизнес-решений. В Java 8 все основные классы даты и времени реализуют интерфейсы Temporal и TemporalAccessor, поэтому TemporalQuery можно запускать для всех этих классов Java.
1. Интерфейс TemporalQuery
В новом Java Date API интерфейс Temporal представляет дату, время или их комбинацию. Например, LocalDate, LocalDateTime и т. д.
TemporalQuery — это функциональный интерфейс, и поэтому его можно использовать в качестве цели назначения для лямбда-выражения или ссылки на метод. Метод queryFrom() принимает объект Temporal для запроса и возвращает запрошенное значение.
Его реализации определяют логику запроса и отвечают за документирование этой логики. Он может использоваться любым методом TemporalAccessor для определения результата.
Приведенное определение интерфейса соответствует стандартному API Java.
@FunctionalInterfacepublic interface TemporalQuery<R>{R queryFrom(TemporalAccessor temporal);}
2. Примеры временных запросов
Давайте рассмотрим несколько примеров, чтобы лучше понять этот интерфейс.
2.1. Указано ли время между рабочими часами?
Мы можем использовать TemporalQuery, чтобы определить, находится ли заданное время в определенном диапазоне. Например, находится ли время между рабочими часами или нет.
Местное время сейчас = Местное время.сейчас();System.out.println("Текущий рабочий :: " + now.query(WorkingHoursQuery));private static final TemporalQuery<Boolean> WorkingHoursQuery = temporal -> {Местное время t = Местное время.from(временное);вернуть t.compareTo(LocalTime.of(9, 0)) >= 0&& t.compareTo(LocalTime.of(17, 0)) < 0;};
2.2. Получить финансовый квартал на указанную дату
Мы также можем использовать TemporalQuery для определения текущего финансового квартала года.
В примере ниже первый финансовый квартал рассматривается с января по март. Измените реализацию метода для желаемого поведения.
LocalDate сегодня = LocalDate.now();System.out.println("Текущий финансовый квартал :: " + today.query(CurrentQuarterQuery));private static final TemporalQuery<Integer> CurrentQuarterQuery = temporal -> {LocalDate дата = LocalDate.from(временная);вернуть(date.getMonthValue() / 3) + 1;};
3. Заключение
В этом уроке мы узнали об интерфейсе TemporalQuery и о том, как использовать его для запроса временных объектов в сложных случаях использования.