我的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)
}
})
Run Code Online (Sandbox Code Playgroud)
它运作得很好.但是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 -> (y-x).compareTo(0)}
Run Code Online (Sandbox Code Playgroud)
这个工作很糟糕.但是,它无法编译:
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)
Run Code Online (Sandbox Code Playgroud)
出了什么问题?提前致谢.
试试这种方式:
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) })
Run Code Online (Sandbox Code Playgroud)
工作代码有很多答案,但我会尝试解释为什么代码不能正常工作.看看这个lambda:
p0, p1 -> (p1-p0).compareTo(0)
Run Code Online (Sandbox Code Playgroud)
它将生成一个方法,在我们的例子中,返回最后一个被调用方法内部指定的类型 - compareTo.换句话说 - 这个lambda将返回整数.但是你的代码需要一个double,所以你应该指定返回值的类型Double.现在,当您有理由可以随意使用任何建议的解决方案,这更适合您.
| 归档时间: |
|
| 查看次数: |
2253 次 |
| 最近记录: |