Il peut y avoir la manière évidente de changer le signe, si vous triez par une valeur numérique
list.sortBy(- _.size)
Plus généralement, le tri peut être effectué par une méthode triée avec un ordre implicite, que vous pouvez rendre explicite, et le tri a un inverse (pas la liste inversée ci-dessous).
list.sorted(theOrdering.reverse)
Si l'ordre que vous souhaitez inverser est l'ordre implicite, vous pouvez l'obtenir implicitement [Ordering [A]] (A le type sur lequel vous commandez) ou mieux Ordering [A]. Ce serait
list.sorted(Ordering[TheType].reverse)
sortBy, c'est comme utiliser Ordering.by, donc vous pouvez faire
list.sorted(Ordering.by(_.size).reverse)
Peut-être pas le plus court à écrire (par rapport au moins) mais l'intention est claire
Mettre à jour
La dernière ligne ne fonctionne pas. Pour accepter le _
in Ordering.by(_.size)
, le compilateur doit savoir sur quel type nous commandons, afin qu'il puisse taper le _
. Il peut sembler que ce serait le type de l'élément de la liste, mais ce n'est pas le cas, comme l'est la signature de trié
def sorted[B >: A](ordering: Ordering[B])
. L'ordre peut être activé A
, mais aussi sur n'importe quel ancêtre de A
(vous pourriez utiliser byHashCode : Ordering[Any] = Ordering.by(_.hashCode)
). Et en effet, le fait que cette liste soit covariante force cette signature. On peut faire
list.sorted(Ordering.by((_: TheType).size).reverse)
mais c'est beaucoup moins agréable.