Expresiones de objects de Kotlin: ejemplo de comparación

Este código básicamente ordera la matriz en un order descendente:

val arrayList = arrayListOf(1, 5, 2) Collections.sort(arrayList, object : Comparator<Int> { override fun compare(x : Int, y: Int) = y - x }) 

¿Cómo en el mundo se puede anular el método de comparación con y - x ? ¿Cómo sabe Kotlin qué y - x significa poner y antes de x si y < x ?

Esto en realidad no tiene nada que ver con Kotlin. Está relacionado con la interfaz Comparator de la API de Java, y cómo Collections.sort lo usa.

De la documentation:

Compara sus dos arguments por order. Devuelve un integer negativo, cero o un integer positivo, ya que el primer argumento es menor, igual o mayor que el segundo.

Ahora intentemos esto por los arguments que dio:

  • 1 – 5 = -4 (un integer negativo), por lo que 1 es menor que 5.
  • 5 – 2 = 3 (un integer positivo), entonces 5 es mayor que 2.
  • etc …

Collections.sort no sabe nada sobre lo que significa y – x . Simplemente respeta el contrato definido de la interfaz del Comparador que cualquier implementador también debe respetar (si quiere funcionar).

Da la casualidad de que y - x es una implementación que respeta ese contrato, porque Math.

Dado que Comparator es una interfaz SAM, puede escribir este código de manera más concisa utilizando un lambda:

 Collections.sort(arrayList, {x : Int, y: Int -> y - x}) 

O incluso

 Collections.sort(arrayList) { x, y -> y - x } 

ya que lambda es el último parámetro de la function de sort y se puede inferir el tipo de datos de x .


Tomar dos objects y tener que definir un integer único para ellos es una abstracción de una definición de sorting. Básicamente, especifique en qué order esos elementos se tendrían en count si se clasificaran.

Para orderar integers, puede parecer una exageración, pero considere tener que clasificar objects más complejos, por ejemplo, instancias de una class Car .

Esta class tiene un colorCode y desea orderar por eso:

 Collections.sort(cars) { car1, car2 -> car1.colorCode - car2.colorCode } 

Así es como definirías un order para esos objects de una manera abstracta.

En Kotlin también puede orderar elementos usando las funciones de extensión de collections de kotlin orderar, orderar, orderar Por … etc.

 val arrayList = arrayListOf(1, 5, 2).sorted() //1,2,5 

o

 val arrayList = arrayListOf(1, 5, 2).sortedDescending() //5,2,1 
  • No se llama a ninguno de los suscriptores de RxJava onNext / onError / onComplete al encadenar Observables creado desde Observable.create ()
  • Android kotlin y Room Persistences library not building
  • Botón de dialog Anko titile
  • ¿Cómo deserializar ThreeTen LocalDateTime en Retrofit?
  • findViewById ClassCastExcpetion
  • Kotlin: ¿Cómo ejecutar methods de service en el context de una class de transacción?
  • Kotlin, cómo recuperar el valor del campo a través de la reflexión
  • Kotlin: ¿Puedes usar arguments con nombre para varargs?
  • ¿Cómo puedo agregar de manera condicional una operación asincrónica en medio de una transmisión de RxJava?
  • Hacer reference al valor y a los methods de llamada en types de class generics
  • Errores de extensión de Kotlin