Scala sortBy 使用 Option 键降序

Scala sortBy descending with Option key

我有以下对象:

class Registration(
    domain: _root_.scala.Predef.String = "",
    registeredAt: Option[com.google.protobuf.timestamp.Timestamp] = None
)

我需要按 registeredAt desc 对项目进行排序。

我试过了:

registrations.sortBy(_.registeredAt)(ord.reverse)

implicit def ord: Ordering[Option[Timestamp]] = Ordering.by(_.seconds)

但是,我在 _.seconds 上收到错误消息,因为 registeredAt 是 Option。

我也试过:

implicit val timeStampOrdering = new Ordering[Option[Timestamp]] {
    override def compare(x: Option[Timestamp], y: Option[Timestamp]): Int = x.map(_.seconds) compareTo y.map(_.seconds)
  }

但是我在 compareTo

上有一个错误

我该如何解决?

您正在尝试创建 Ordering[Timestamp],而您需要的是

implicit def ord: Ordering[Option[Timestamp]] = Ordering.by(_.map(_.seconds))

sortBy 调用中提取 seconds 并避免需要新的 Ordering 可能是最简单的。取反数进行反向排序:

registrations.sortBy(_.registeredAt.fold(0)(0 - _.seconds))

(或registeredAt.map(_.seconds).getOrElse(0)

您可以只使用隐式 Ordering[Timestamp]

Ordering 中有一个隐式转换,可以将任何 Ordering[T] 转换为 Ordering[Option[T]]:

implicit def ord: Ordering[Timestamp] =
  Ordering.by(_. seconds)

implicitly[Ordering[Option[Timestamp]]] //we have this ordering