Если у вас есть:
val collection: SomeCollection[A]
val keyToSortBy A => B
, когда вы делаете:
collection.sortBy(keyToSortBy)
, то получается, что Scala будет искать Ordering[B]
в своей неявной области (читайте о последствиях) если вы еще не знакомы с ними), и он будет использовать методы, предоставленные этим интерфейсом, для сравнения элементов с помощью алгоритма сортировки.
sortBy
будет использовать Ordering[X]
для сортировки вещей в порядке возрастания (подумайте Comparator
если вы знаете Java). Для Ordering[Int]
это просто увеличение порядка целых чисел, для Ordering[String]
у вас есть лексический порядок Strings
.
Что -
здесь делает, это берет значение перед передачей его алгоритму, сортирующему по Int
и отрицая это. Было бы проще, если бы вы увидели какой-то пример:
List("a", "bb", "ccc").sortBy(word => word.length)
// imagine that what it does is:
// - building a collection of pairs ("a", 1), ("bb", 2), ("ccc", 3)
// ( (value from collection, what function returned for that value) )
// - sorting by the second element of pair
// using normal Int comparison to get ascending result
// - take only the first element of each pair: ("a", 1), ("bb", 2), ("ccc", 3)
List("a", "bb", "ccc") // result
Если мы поместим туда -
, то, что Ordering
получит для компиляции, будет другим:
List("a", "bb", "ccc").sortBy(word => -word.length)
// - building a collection of pairs ("a", -1), ("bb", -2), ("ccc", -3)
// - sorting by the second element of pair - notice that all are negative now!!!
// using normal Int comparison to get ascending result
// - take only the first element of each pair: ("ccc", -3), ("bb", -2), ("a", -1)
List("ccc", "bb", "a") // result