我现在第一次使用 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 文档的时间。

结果:
  • 我想出了//... 行。两个版本都可以正常工作。
  • 我知道我根本不理解“from”-Method。 (例如,它从哪里获取数据?)

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

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

    如果是,这些情况会是什么?

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

    任何帮助表示赞赏。

    最佳答案

    我也发现第二个更清楚。

    不过,让我们尝试解释第一个。

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

    10-07 19:52