我正在尝试学习
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文档的一些阅读时间.
结果:
>我想出了//…line.两个版本都运行良好.
>我明白我根本不理解“来自” – 方法. (例如,它从哪里获取数据?)
这让我想到了我的主要问题:
这两个版本之间是否存在显着差异,导致依赖于用例的最佳实践?
如果是,这些案件会是什么?
(如果有人能够进一步解释第一个版本我会很高兴.)
任何帮助表示赞赏.
最佳答案 我还发现第二个更清楚.
我们试着解释第一个.
DateTimeFormatter将String解析为称为“TemporalAccessor”的东西,这是一个可以查询以获取各种日期和时间字段的对象.
但大多数时候你不想要TemporalAccessor.例如,您需要ZonedDateTime,LocalDate或LocalDateTime.因此,您需要一种策略将TemporalAccessor转换为您想要的类型.
这种策略称为TemporalQuery.
TemporalQuery< R>是一个功能界面,其独特的抽象方法是
R queryFrom(TemporalAccessor temporal)
因此,正如您所看到的,它确实允许将TemporalAccessor转换为其他内容.
一旦有了这样的TemporalQuery,就可以使用DateTimeFormatter中的以下方法:
public T parse(CharSequence text, TemporalQuery 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);
}