Подтвердить что ты не робот

Идиоматическое использование сопоставимого объекта Java

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

4b9b3361

Ответ 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).