java-8 - 如何使方法通用以与 LocalDate 和 LocalDateTime 一起使用?

标签 java-8 polymorphism java-time jsr310

我有一个 Java 方法如下:

private static boolean isDateBetweenRange(DataSet obj, MyClass dataSource, ConditionContext context) {
    FilterContext fc = dataSource.getData();

    LocalDate dateFieldToCheck = obj.getDate(fc.getDateField()).toInstant()
                                   .atZone(ZoneId.systemDefault()).toLocalDate();
    LocalDate minDate = fc.getMinDateValue();
    LocalDate maxDate = fc.getMaxDateValue();

    if (minDate == null || maxDate == null) {
        minDate = context.getStartDate().toInstant().atZone(ZoneId.systemDefault())
                    .toLocalDate();
        maxDate = context.getEndDate().toInstant().atZone(ZoneId.systemDefault())
                    .toLocalDate();
    }

    boolean result = (dateFieldToCheck.isAfter(minDate) || dateFieldToCheck.isEqual(minDate))
            && (dateFieldToCheck.isBefore(maxDate) || dateFieldToCheck.isEqual(maxDate));

    return result;
}

我也想为 LocalDateTime 制定相同的逻辑。如果我重载该方法,它将与 LocalDateTime 的代码完全相同。

如何使用泛型或任何其他机制使方法通用以与 LocalDateLocalDateTime 一起使用?

如何根据我的类型使 context.getXXXDate()... toLocalDate()toLocalDateTime() 成为通用代码?

最佳答案

TemporalAccessor 接口(interface)可用于执行此操作。但是,请注意 TemporalAccessor 是一个高级接口(interface),不应在低级实用程序代码之外使用。

boolean api(TemporalAccessor temporal1, TemporalAccessor temporal2) {
  LocalDate date1 = LocalDate.from(temporal1);
  LocalDate date2 = LocalDate.from(temporal2);
  return ...;
}

此代码现在将接受 LocalDateLocalDateTimeOffsetDateTimeZonedDateTime

如评论中所述,在一段业务逻辑中仅调用一次 ZoneId.systemDefault() 至关重要,因为该值可能会发生变化。

关于java-8 - 如何使方法通用以与 LocalDate 和 LocalDateTime 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44694236/

相关文章:

java - minStack 子类使用一个对象作为最小堆栈和常规堆栈

java - 将 LocalDateTime 转换为 UTC 中的 LocalDateTime

java - 按时间间隔对 Java 8 日期进行分组

date - 获取本周第一天和当前时间 JDK 8 之间的时间范围

haskell - Rank2Types/RankNTypes 在没有多型变量的情况下是否实用?

c++ - 创建一个子类来影响另一个子类的行为

java - 在 Java 8 中使用 forEach

java-8 - JavaFX : ObsevableMap keySet as an ObservableSet

java - 对 Java 8 流进行分区

Java SE 嵌入式和 Java ME