Java Reference
In-Depth Information
Queries
Under a wide variety of circumstances we may find ourselves wanting to answer a
question about a particular temporal object. Some example questions we may want
answers to are:
• Is the date before March 1st?
• Is the date in a leap year?
• How many days is it from today until my next birthday?
This is acheived by the use of the
TemporalQuery
interface, which is defined like
this:
public
interface
TemporalQuery
<
R
>
{
R
queryFrom
(
TemporalAccessor
temporal
);
}
The parameter to
queryFrom()
should not be null, but if the result indicates that a
value was not found, null could be used as a return value.
The
Predicate
interface can be thought of as a query that can
only represent answers to yes-or-no questions. Temporal
queries are more general and can return a value of “How
many?” or “Which?” instead of just “yes” or “no.”
Let's look at an example of a query in action, by considering a query that answers
the following question: “Which quarter of the year is this date in?” Java 8 does not
support the concept of a quarter directly. Instead, code like this is used:
LocalDate
today
=
LocalDate
.
now
();
Month
currentMonth
=
today
.
getMonth
();
Month
firstMonthofQuarter
=
currentMonth
.
firstMonthOfQuarter
();
This still doesn't give quarter as a separate abstraction and instead special case code
is still needed. So let's slightly extend the JDK support by defining this enum type:
public
enum
Quarter
{
FIRST
,
SECOND
,
THIRD
,
FOURTH
;
}
Now, the query can be written as:
public
class
QuarterOfYearQuery
implements
TemporalQuery
<
Quarter
>
{
@Override
public
Quarter
queryFrom
(
TemporalAccessor
temporal
)
{
LocalDate
now
=
LocalDate
.
from
(
temporal
);
if
(
now
.
isBefore
(
now
.
with
(
Month
.
APRIL
).
withDayOfMonth
(
1
)))
{
return
Quarter
.
FIRST
;
}
else
if
(
now
.
isBefore
(
now
.
with
(
Month
.
JULY
)