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)} 
  • Kotlin: ¿Cómo puedo invocar un campo lambda que tiene un tipo genérico de su class?
  • ¿Por qué no puedo usar lambda para la interfaz en kotlin?
  • Kotlin: lambda nunca comstack
  • ¿Por qué Kotlin no puede inferir el siguiente argumento lambda (después de la conversión de Java -> Kotlin)?
  • ¿Por qué la variable no se puede inicializar correctamente en la function en línea como en Java?
  • Kotlin genera class interna para lambda
  • Kotlin - Lista dentro de un filter de list
  • Kotlin lambdas y tipo de inferencia
  • Kotlin: Declaración a Lambda
  • Kotlin lambdas sin usar objects
  • Inicializador de propiedad de múltiples líneas / complejo sin lambda