习惯使用Java可比对象

时间:2011-12-13 01:47:24

标签: scala scala-java-interop

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

3 个答案:

答案 0 :(得分:12)

在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

答案 1 :(得分:7)

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

import scala.math.Ordering.Implicits._

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

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

答案 2 :(得分: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<类包含>=Date等方法,这个隐式def就是Ordering的类型参数(这里是任何{{1}}实例)的 pimp my library 模式的一个例子