我现在第一次使用 LocalDate 来尝试学习 Java。引用是本教程:
JavaFX8 Tutorial-Part3
特别是这段代码(带有一个额外的注释行):
public static LocalDate parse(String dateString) {
try {
return DATE_FORMATTER.parse(dateString, LocalDate::from);
//return LocalDate.parse(dateString, DATE_FORMATTER);
} catch (DateTimeParseException e) {
return null;
}
}
第一次返回与教程中相同。我并不真正理解方法引用,这使我进行了一些互联网搜索,这使我找到了 Oracle Java 教程和一些阅读 Java 8 文档的时间。
结果:
这让我想到了我的主要问题:
这两个版本之间是否存在显着差异,从而导致依赖于用例的最佳实践?
如果是,这些情况会是什么?
(如果有人可以进一步解释第一个版本,我会很高兴。)
任何帮助表示赞赏。
最佳答案
我也发现第二个更清楚。
不过,让我们尝试解释第一个。
DateTimeFormatter 将字符串解析为称为“TemporalAccessor”的东西,这是一个可以查询以获取各种日期和时间字段的对象。
但大多数时候你不想要一个 TemporalAccessor。例如,您需要 ZonedDateTime、LocalDate 或 LocalDateTime。因此,您需要一种将 TemporalAccessor 转换为您想要的类型的策略。
此策略称为 TemporalQuery。TemporalQuery<R>
是一个函数式接口(interface),其唯一的抽象方法是
R queryFrom(TemporalAccessor temporal)
因此,如您所见,它确实允许将 TemporalAccessor 转换为其他内容。
一旦有了这样的 TemporalQuery,就可以使用 DateTimeFormatter 中的以下方法:
public <T> T parse(CharSequence text, TemporalQuery<T> query)
它将首先将文本解析为 TemporalAccessor,然后使用查询将 TemporalAccessor 转换为其他内容。
在您的情况下,您需要一个 LocalDate。因此,您需要一个
TemporalQuery<LocalDate>
的实现,即一个采用 TemporalAccessor 并返回一个 LocalDate 的方法。 LocalDate.from(TemporalAccessor)
就是这样一种方法。因此,您可以将对该方法的引用传递给 parse 方法并获得一个 LocalDate(前提是从文本中获取的 TemporalAccessor 包含所需的日期信息)。事实上,这正是您示例中的第二行所做的:它的实现是:
public static LocalDate parse(CharSequence text, DateTimeFormatter formatter) {
Objects.requireNonNull(formatter, "formatter");
return formatter.parse(text, LocalDate::from);
}