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 
  • Kotlin + JUnit + postgres para testings de integración: conexiones filtradas
  • ¿Cómo ocultar el button inferior cuando el keyboard está abierto en kotlin?
  • Soporte de transición de fragment 25.1.0 con Recyclerview
  • SparkJava no puede funcionar junto con algunas API de Google Youtube
  • testing unitaria con apache storm y cassandra: topología local que no consume el post de kafka
  • ¿Imponer una compilation de methods estáticos dentro de una subclass con Kotlin?
  • ¿Cómo manejar los errores de escritura en Apache Jena?
  • Error del complemento Kotlin: no se pudo generar una class proxy para la class org.jetbrains.kotlin.gradle.tasks.KotlinCompile
  • ¿Es posible ejecutar el complemento de grado kotlin usando jdk 7?
  • ¿Cómo observar los datos de PagedList?
  • Modificador de visibilidad equivalente del package en Kotlin