15

我正在使用一些 java.util.Date(它实现了 java.lang.Comparable)并且希望能够很好地使用它,例如使用 < 和 >= 而不是“compareTo(other) == 1”。有没有一种很好的方法可以轻松地混合像 scala.math.Ordered 这样的东西而没有很多样板?

4

3 回答 3

13

在 Ordering 伴随对象中有一个从 Comparable[A] 到 Ordering[A] 的隐式转换。所以你可以这样做:

import java.util.Date

val dateOrdering = implicitly[Ordering[Date]]
import dateOrdering._

val now = new Date
val then = new Date(now.getTime + 1000L)

println(now < then) // true
于 2011-12-13T04:59:10.963 回答
10

我知道这是一个老问题,但这里有一个稍微简单的解决方案,在提出问题时可能不可用。

import scala.math.Ordering.Implicits._

任何实现的 Java 类型都Comparable应该与比较运算符无缝协作。例如,

import java.time.Instant

val x = Instant.now()
val y = x.plusSeconds(1)

print(x < y)   // prints true
print(x <= y)  // prints true
print(x > y)   // prints false
于 2015-09-16T16:18:31.973 回答
2

在这种情况下你不能混进去Ordered,afaik...我试过了,但遇到了困难,因为compareTojava.lang.Comparable. 编译器抱怨Ordered没有override在它的方法定义中使用;我不知道如何解决这个问题。

所以定义一个隐式Ordering[Date]. 您可以将此DateOrdering对象放在任何地方(例如,在伴随对象中)。

import java.util.Date
implicit object DateOrdering extends Ordering[Date] {
  def compare(x: Date, y: Date) = x compareTo y
}

然后在您的代码中:

import DateOrdering._
val a = new Date
Thread.sleep(1000)
val b = new Date
println(a < b)     // prints true
println(a >= b)    // prints false

Ordering对象包含一个implicit def mkOrderingOps (lhs: T): Ops. 该类Ops包含<. >=等方法,这个隐含的 def 是我的库模式的一个例子,无论 Ordering 的类型参数是什么(这里是任何Date实例)。

于 2011-12-13T04:33:42.270 回答