我想使用java.time.LocalDate
和java.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/