convert comparator en lambda en Kotlin

Hay un fragment de código en mi código de Kotlin:

val dataMap = sensoryDataUsage.groupBy { it } .mapValues { it.value.count().toDouble()/count } .mapKeys { println(it.key); it.key.toDouble()/max } .toSortedMap(object : Comparator<Double> { override fun compare(p0: Double, p1: Double): Int { return (p1-p0).compareTo(0) } }) 

Funcionó bien. Sin embargo, el IDE me sigue sugiriendo que convierta ese object Comparator en un lambda, y eso es exactamente lo que hice:

 val dataMap = sensoryDataUsage.groupBy { it } .mapValues { it.value.count().toDouble()/count } .mapKeys { println(it.key); it.key.toDouble()/max } .toSortedMap {x, y -> (yx).compareTo(0)} 

Este trabajo. Sin embargo, no se puede comstackr:

 Error:(32, 14) Kotlin: Type inference failed: fun <K, V> Map<out K, V>.toSortedMap(comparator: Comparator<in K>): SortedMap<K, V> cannot be applied to receiver: Map<Double, Double> arguments: ((Double, Double) -> Int) 

¿Alguna idea de lo que salió mal? Gracias por adelantado.

Pruebe de esta manera:

 val dataMap = sensoryDataUsage.groupBy { it } .mapValues { it.value.count().toDouble()/count } .mapKeys { println(it.key); it.key.toDouble()/max } .toSortedMap(Comparator<Double> { p0, p1 -> (p1-p0).compareTo(0) }) 

Tiene muchas respuestas con código de trabajo, pero intentaré explicar por qué no funcionó su código. Echa un vistazo a esta lambda:

 p0, p1 -> (p1-p0).compareTo(0) 

Generaría un método que devuelve el tipo especificado dentro del último método llamado, en nuestro caso – compareTo . En otras palabras, esta lambda devolvería un integer. Pero su código necesita un doble, por lo que debe especificar el tipo de valor de retorno como Double . Ahora, cuando tenga una razón, siéntase libre de utilizar cualquiera de las soluciones sugeridas, que le conviene más.

tu código debería ser así:

 val dataMap = sensoryDataUsage.groupBy { it } .mapValues { it.value.count().toDouble()/count } .mapKeys { println(it.key); it.key.toDouble()/max } .toSortedMap(Comparator<Double>{x, y -> (yx).compareTo(0)}); 

O puede eliminar la expresión yx :

 val dataMap = sensoryDataUsage.groupBy { it } .mapValues { it.value.count().toDouble()/count } .mapKeys { println(it.key); it.key.toDouble()/max } .toSortedMap(Comparator<Double>{x, y -> y.compareTo(x)}); 

O usando compareByDescending en compareByDescending lugar:

 val dataMap = sensoryDataUsage.groupBy { it } .mapValues { it.value.count().toDouble()/count } .mapKeys { println(it.key); it.key.toDouble()/max } .toSortedMap(compareByDescending{ it }); 

Reemplazar

 .toSortedMap {x, y -> (yx).compareTo(0)} 

con

 .toSortedMap {x:Double, y:Double -> (yx).compareTo(0)} 
  • Poniendo un lambda genérico en un map
  • Kotlin: function genérica como tipo de retorno?
  • ¿Cómo declaro un parámetro de function para aceptar funciones que arrojan?
  • java.lang.NoClassDefFoundError $$ inlined $ forEach $ lambda $ 1 en Kotlin
  • Kotlin: ¿Para qué se llaman los arguments lambda?
  • ¿Cómo escribir lambdas con generics en kotlin?
  • Kotlin genera class interna para lambda
  • ¿Por qué la variable no se puede inicializar correctamente en la function en línea como en Java?
  • Función para expresión lambda
  • La expresión lambda no se usa
  • Pasando lambda en lugar de interfaz