我正在尝试学习java时第一次使用LocalDate。引用将是本教程:
特别是这段代码(带有一个额外的注释行):
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文档的一些阅读时间。
结果:
这让我想到了我的主要问题:
这两个版本之间是否存在显着差异,导致依赖于用例的最佳实践?
如果是,这些案件会是什么?
(如果有人能够进一步解释第一个版本我会很高兴。)
感谢任何帮助。
答案 0 :(得分:2)
我还发现第二个更清楚。
让我们尝试解释第一个。
DateTimeFormatter将String解析为名为" TemporalAccessor"的对象,您可以查询该对象以获取各种日期和时间字段。
但大部分时间你都不想要TemporalAccessor。例如,您需要ZonedDateTime,LocalDate或LocalDateTime。因此,您需要一种策略将TemporalAccessor转换为您想要的类型。
此策略称为TemporalQuery。
TemporalQuery<R>
是一个功能界面,其独特的抽象方法是
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);
}