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
我有以下对象:
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