import java.time.Month;
import java.time.Year;
import java.time.LocalDate;
import java.time.DateTimeException;
import java.time.temporal.TemporalQuery;
import java.time.temporal.TemporalAccessor;
import java.io.PrintStream;
public class CheckDate {
public static void main(String[] args) {
Month month = null;
LocalDate date = null;
if (args.length < 2)
{
System.out.printf("Usage: CheckDate <month> <day>%n");
throw new IllegalArgumentException();
}
try {
month = Month.valueOf(args[0].toUpperCase());
} catch (IllegalArgumentException exc) {
System.out.printf("%s is not a valid month.%n", args[0]);
throw exc; // Rethrow the exception.
}
int day = Integer.parseInt(args[1]);
try {
date = LocalDate.of(Year.now().getValue(), month, day);
} catch (DateTimeException exc) {
System.out.printf("%s %s is not a valid date.%n", month, day);
throw exc; // Rethrow the exception.
}
// Invoking the query without using a lambda expression.
Boolean isFamilyVacation = date.query(new FamilyVacations());
// Invoking the query using a lambda expression.
Boolean isFamilyBirthday = date.query(FamilyBirthdays::isFamilyBirthday);
if (isFamilyVacation.booleanValue() || isFamilyBirthday.booleanValue())
System.out.printf("%s is an important date!%n", date);
else
System.out.printf("%s is not an important date.%n", date);
}
}
import java.time.Month;
import java.time.Year;
import java.time.LocalDate;
import java.time.DateTimeException;
import java.time.temporal.TemporalQuery;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.ChronoField;
import java.io.PrintStream;
import java.lang.Boolean;
public class FamilyVacations implements TemporalQuery<Boolean> {
// Returns true if the passed-in date occurs during one of the
// family vacations. Because the query compares the month and day only,
// the check succeeds even if the Temporal types are not the same.
// 如果传入日期恰好处于家庭假期的时间段内,返回true
// 因为查询比较的是月份和日份,即使针对是不同类型“期间”,检查也会成功
public Boolean queryFrom(TemporalAccessor date) {
int month = date.get(ChronoField.MONTH_OF_YEAR);
int day = date.get(ChronoField.DAY_OF_MONTH);
// Disneyland over Spring Break
if ((month == Month.APRIL.getValue()) && ((day >= 3) && (day <= 8)))
return Boolean.TRUE;
// Smith family reunion on Lake Saugatuck
if ((month == Month.AUGUST.getValue()) && ((day >= 8) && (day <= 14)))
return Boolean.TRUE;
return Boolean.FALSE;
}
}
import java.time.Month;
import java.time.Year;
import java.time.LocalDate;
import java.time.DateTimeException;
import java.time.temporal.TemporalQuery;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.ChronoField;
import java.io.PrintStream;
import java.lang.Boolean;
public class FamilyBirthdays {
// Returns true if the passed-in date is the same as one of the
// family birthdays. Because the query compares the month and day only,
// the check succeeds even if the Temporal types are not the same.
public static Boolean isFamilyBirthday(TemporalAccessor date) {
int month = date.get(ChronoField.MONTH_OF_YEAR);
int day = date.get(ChronoField.DAY_OF_MONTH);
// Angie's birthday is on April 3.
if ((month == Month.APRIL.getValue()) && (day == 3))
return Boolean.TRUE;
// Sue's birthday is on June 18.
if ((month == Month.JUNE.getValue()) && (day == 18))
return Boolean.TRUE;
// Joe's birthday is on May 29.
if ((month == Month.MAY.getValue()) && (day == 29))
return Boolean.TRUE;
return Boolean.FALSE;
}
}