scala - 如何在 java.time.LocalDate 上隐式排序

标签 scala implicit java-time localdate

我想使用java.time.LocalDatejava.time.LocalDateTime隐含 Ordered像:

val date1 = java.time.LocalDate.of(2000, 1, 1)
val date2 = java.time.LocalDate.of(2010, 10, 10)
if (date1 < date2) ...

import scala.math.Ordering.Implicits._不起作用,因为 LocalDate继承自Comparable<ChronoLocalDate>而不是Comparable<LocalDate> 。 我如何编写自己的隐式命令以使用 <、<=、>、>= 运算符/方法进行比较 LocalDate的?

编辑:

我找到了一种使用隐式类的方法:

import java.time.{LocalDate}

object MyDateTimeUtils {
  implicit class MyLocalDateImprovements(val ld: LocalDate)
           extends Ordered[LocalDate] {
    def compare(that: LocalDate): Int = ld.compareTo(that)
  }
}

// Test

import MyDateTimeUtils._

val d1 = LocalDate.of(2016, 1, 1)
val d2 = LocalDate.of(2017, 2, 3)

if (d1 < d2) println("d1 is less than d2")

但我更喜欢 Scala 为所有实现 Comparable<T> 的 Java 类所做的方式。你只需要 import scala.math.Ordering.Implicits._在你的代码中。 Scala 的实现如下:

implicit def ordered[A <% Comparable[A]]: Ordering[A] = new Ordering[A] {
  def compare(x: A, y: A): Int = x compareTo y
}

但不幸的是LocalDate实现Comparable<ChronoLocalDate>而不是Comparable<LocalDate> 。我找不到修改上述隐式有序方法以适应 LocalDate 的方法/Comparable<ChronoLocalDate> 。有什么想法吗?

最佳答案

您可以使用Ordering.by为任何类型创建排序,给定一个从该类型到已经具有排序的函数的函数 - 在本例中为Long :

implicit val localDateOrdering: Ordering[LocalDate] = Ordering.by(_.toEpochDay)

关于scala - 如何在 java.time.LocalDate 上隐式排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38059191/

相关文章:

java - java.time.Clock.systemDefaultZone().getZone() 与 java.util.TimeZone.getDefault().toZoneId() 之间有什么区别?

scala - 如何使用其架构从Spark数据框架创建配置单元表?

Scala 隐式优先级系统

scala - 前向引用扩展了值(value)问题的定义

Scala - 如何创建可用于类型构造函数的单个隐式

java - 从 joda 时间到 java.time 的 `w` 符号格式不一致

嵌套递归函数的 Scala 前向引用

scala - 如何在scala中设置类型参数绑定(bind)来为数字创建泛型函数?

scala - 在对象中没有定义的类型声明是什么意思?

java - 使用 Locale 格式化 LocalDateTime 实例时获取 java.time.DateTimeException