Java LocalDate:解析 – 使用方法引用实现或没有,差异,最佳实践?

我正在尝试学习
java时第一次使用LocalDate.参考将是本教程:

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文档的一些阅读时间.

结果:

>我想出了//…line.两个版本都运行良好.
>我明白我根本不理解“来自” – 方法. (例如,它从哪里获取数据?)

这让我想到了我的主要问题:

这两个版本之间是否存在显着差异,导致依赖于用例的最佳实践?

如果是,这些案件会是什么?

(如果有人能够进一步解释第一个版本我会很高兴.)

任何帮助表示赞赏.

最佳答案 我还发现第二个更清楚.

我们试着解释第一个.

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);
}
点赞