Potrebbe esserci il modo ovvio di cambiare il segno, se si ordina in base a un valore numerico
list.sortBy(- _.size)
Più in generale, l'ordinamento può essere eseguito con il metodo ordinato con un ordinamento implicito, che è possibile rendere esplicito, e l'ordinamento ha un rovescio (non l'elenco rovesciato di seguito).
list.sorted(theOrdering.reverse)
Se l'ordinamento che si desidera invertire è l'ordinamento implicito, è possibile ottenerlo implicitamente [Ordine [A]] (A il tipo su cui si sta ordinando) o Ordine migliore [A]. Sarebbe
list.sorted(Ordering[TheType].reverse)
sortBy è come usare Ordering.by, quindi puoi farlo
list.sorted(Ordering.by(_.size).reverse)
Forse non è il più breve da scrivere (rispetto al meno) ma l'intento è chiaro
Aggiornare
L'ultima riga non funziona. Per accettare _
in Ordering.by(_.size)
, il compilatore deve sapere su quale tipo stiamo ordinando, in modo che possa digitare _
. Potrebbe sembrare che sarebbe il tipo di elemento dell'elenco, ma non è così, come lo è la firma di ordinati
def sorted[B >: A](ordering: Ordering[B])
. L'ordinamento può essere attivo A
, ma anche su qualsiasi antenato di A
(è possibile utilizzare byHashCode : Ordering[Any] = Ordering.by(_.hashCode)
). E infatti, il fatto che l'elenco sia covariante forza questa firma. Uno può fare
list.sorted(Ordering.by((_: TheType).size).reverse)
ma questo è molto meno piacevole.