Идиоматическое использование сопоставимого объекта Java - PullRequest
14 голосов
/ 13 декабря 2011

Я использую некоторый java.util.Date (который реализует java.lang.Comparable) и хотел бы иметь возможность использовать его красиво, например, использовать <и> = вместо «compareTo (other) == 1»,Есть ли хороший способ легко смешать что-то вроде scala.math. Заказывается без большого количества котельной плиты?

Ответы [ 3 ]

12 голосов
/ 13 декабря 2011

В сопутствующем объекте 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
7 голосов
/ 16 сентября 2015

Я знаю, что это старый вопрос, но вот несколько более простое решение, которое, возможно, не было доступно, когда был задан вопрос.

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
2 голосов
/ 13 декабря 2011

Нельзя смешивать в Ordered в этом случае, афаик ... Я попробовал это и столкнулся с трудностями, потому что 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 содержит <.>= и т. Д., И это неявное определение является примером шаблона pimp my library для любого параметра типа Ordering (здесь любой экземпляр Date).

...