将比较器转换为Kotlin中的lambda

在我的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对象转换为lambda,我只是这样做了:

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

你有很多与工作代码的答案,但我会尽力解释你的代码为什么不工作。 看看这个lambda:

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

它会生成一个方法,返回最后调用的方法内部指定的类型,在我们的例子中是compareTo 。 换句话说 – 这个lambda会返回整数。 但是你的代码需要一个double,所以你应该指定返回值类型为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)}