Я использую java.util.Date(который реализует java.lang.Comparable) и хотел бы иметь возможность использовать его красиво, например. используют < и >= вместо "compareTo (other) == 1". Есть ли хороший способ просто смешать что-то вроде scala.math.Ordered без большого количества плиты котла?
Идиоматическое использование сопоставимого объекта Java
Ответ 1
В объекте-компаньоне 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
Ответ 2
Я знаю, что это старый вопрос, но здесь немного более простое решение, которое может быть недоступно, когда задавался вопрос.
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
Ответ 3
Вы не можете смешивать в Ordered
в этом случае, afaik... Я попробовал это и столкнулся с трудностями, потому что compareTo
определяется как там, так и в java.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 является примером шаблона pimp my library на любом параметре типа Ordering (здесь, любой экземпляр Date
).