У меня есть следующий объект:

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

И мне нужно отсортировать элементы по зарегистрированным по убыванию.

Я старался:

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

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

Однако я получаю сообщение об ошибке _.seconds, потому что registerAt - это 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

Как я могу это решить?

0
Dejell 24 Ноя 2021 в 12:20

3 ответа

Лучший ответ

Вы пытаетесь создать Ordering[Timestamp], когда вам нужно

implicit def ord: Ordering[Option[Timestamp]] = Ordering.by(_.map(_.seconds))
0
Johny T Koshy 24 Ноя 2021 в 12:27

Вероятно, проще всего просто извлечь seconds в вызове sortBy и избежать необходимости в новом Ordering. Отмените число для сортировки в обратном порядке:

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

(или registeredAt.map(_.seconds).getOrElse(0))

1
Tim 24 Ноя 2021 в 13:21
Ord - это метод - я не понял, как я могу выкинуть его из вашего ответа
 – 
Dejell
24 Ноя 2021 в 12:46
Извините за путаницу, я обновлю ответ, чтобы удалить ord
 – 
Tim
24 Ноя 2021 в 13:20

Вы можете использовать только неявный Ordering[Timestamp].

В Ordering есть неявное преобразование, которое преобразует любой Ordering[T] в Ordering[Option[T]]:

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

implicitly[Ordering[Option[Timestamp]]] //we have this ordering
0
gatear 24 Ноя 2021 в 13:23