конвертировать компаратор в лямбда в Котлин

В моем коде 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) } }) 

Все прошло отлично. Однако IDE продолжает предлагать мне преобразовать этот объект Comparator в лямбда, и я сделал именно это:

 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)} 

Это работа. Однако он не может быть скомпилирован:

 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) 

Любые идеи, что пошло не так? Заранее спасибо.

Попробуйте так:

 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) }) 

У вас много ответов с рабочим кодом, но я попытаюсь объяснить, почему ваш код не работал. Взгляните на эту лямбду:

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

Он будет генерировать метод, который возвращает тип, указанный внутри последнего вызываемого метода, в нашем случае – compareTo . Другими словами – эта лямбда вернет целое число. Но ваш код нуждается в двойном, поэтому вы должны указать тип возвращаемого значения как Double . Теперь, когда вы получили причины, не стесняйтесь использовать любые предлагаемые решения, которые подходят вам лучше.

ваш код должен выглядеть следующим образом:

 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)}); 

ИЛИ вы можете удалить выражение 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)}); 

ИЛИ используя вместо этого compareByDescending :

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

замещать

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

с

 .toSortedMap {x:Double, y:Double -> (yx).compareTo(0)} 
Intereting Posts
IndexOutOfBoundsException для for-loop в Котлине Может ли объект класса, созданный «на лету» в Котлине, иметь конструктор? Ссылка Kotlin Textview id не работает с неанглийскими символами Kotlin – MainActivity расширяет AppCompatActivity, функция onRequestPermissionsResult не найдена и не может быть переопределена Почему Kotlin не позволяет мне использовать расширение writeText? Почему мы не можем отметить видимость класса как «защищенного» в котлин? @Autowired lateinit property '' не был инициализирован Какая версия Dokka идет с какой версией Kotlin? Kotlin: Сравнить значения свойств различных целевых объектов с (out) отражением AsyncTask в Android с Kotlin Kotlin не компилируется из src / main / kotlin при использовании maven Котлин: проблемы с пониманием дженериков java.lang.IllegalStateException: архивы Dex: установка расширения .DEX только для файлов .CLASS Котлин: оператор двойной толстой кишки (отражение) Определить возвращаемый тип Retrofit с использованием интерфейса вместо класса