Java LocalDate:Parse-Implementation with method reference or without,difference,best practice?

时间:2016-06-26 09:57:11

标签: java

我正在尝试学习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文档的一些阅读时间。

结果:

  1. 我想出了//...line。两个版本都运行良好。
  2. 我明白我根本不理解“来自” - 方法。 (例如,它从哪里获取数据?)
  3. 这让我想到了我的主要问题:

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

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

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

    感谢任何帮助。

1 个答案:

答案 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);
}