如何将Lambda传递给Kotlin中的toSortedSet()

如何将Lambda传递给Kotlin中的toSortedSet(),lambda,kotlin,functional-interface,Lambda,Kotlin,Functional Interface,我有点不明白为什么这不起作用。我有一个简单的Iterable的String,我想通过toSortedSet()我自己的方式进行排序。我想像这样传递一个lambda: myStringIterable.toSortedSet({a,b -> a.compareTo(b)}) val comp = object: Comparator<String> { override fun compare(s1: String, s2: String): Int {

我有点不明白为什么这不起作用。我有一个简单的
Iterable
String
,我想通过
toSortedSet()
我自己的方式进行排序。我想像这样传递一个lambda:

myStringIterable.toSortedSet({a,b -> a.compareTo(b)}) 
val comp = object: Comparator<String> {
    override fun compare(s1: String, s2: String): Int {
        return s2.compareTo(s1) // replace with own logic
    }
}

sortedSetOf(comp, "a", "b", "c")
然而,这似乎不起作用。错误是

类型不匹配。所需的kotlin.比较器<字符串>

找到:(字符串,字符串)->Int

比较器是一个功能接口,所以我应该能够将其作为Lambda传递,不是吗?

您可以使用它将代码包装到比较器中:

toSortedSet(compareBy { it.length })

我认为在您的情况下,
toSortedSet
不需要任何参数。

从Kotlin 1.2开始,SAM转换仅支持Java接口
kotlin.Comparator是kotlin中定义的一个接口,对于此类接口,不支持将lambda转换为这些接口的实现。

yole已经提供了原因,下面是方法:

setOf("a", "b", "c").toSortedSet(object: Comparator<String>{
    override fun compare(s1: String, s2: String): Int {
        return s1.compareTo(s2) // replace with own logic
    }
}) 
setOf(“a”、“b”、“c”)。toSortedSet(对象:比较器{
覆盖有趣的比较(s1:String,s2:String):Int{
返回s1.compareTo(s2)//替换为自己的逻辑
}
}) 
或者像这样:

myStringIterable.toSortedSet({a,b -> a.compareTo(b)}) 
val comp = object: Comparator<String> {
    override fun compare(s1: String, s2: String): Int {
        return s2.compareTo(s1) // replace with own logic
    }
}

sortedSetOf(comp, "a", "b", "c")
val comp=对象:比较器{
覆盖有趣的比较(s1:String,s2:String):Int{
返回s2.compareTo(s1)//替换为自己的逻辑
}
}
分类测试(比较,“a”、“b”、“c”)

不确定这是否是新的,但您可以执行以下操作:

val set = listOf("a", "c", "b").toSortedSet(Comparator { s1, s2 ->
    s1.compareTo(s2) // replace with own logic
})

虽然这个答案是正确的,但它可能无法完全回答OP真正的问题,即为什么简单的lambda不起作用。对于简单的字段选择,
compareBy
可以工作,但是如果OP需要一个复杂的计算来进行比较呢?谢谢您的解决方案。正如DodgyCodeException指出的那样,我的实际情况稍微复杂一些,因此我将其简化为一个带有
String
s的示例,因为它不接受lambdas的问题是相同的。这不是一个很好的反例吗“由于Kotlin具有适当的函数类型,因此不需要将函数自动转换为Kotlin接口的实现”?所有采用
Comparator
的标准库方法是否应获得重载(或扩展函数“重载”)获取函数?@AlexeyRomanov很可能我们会在未来的语言版本中添加对Kotlin接口SAM转换的支持,因此我认为现在添加这些重载是没有意义的。而且标准库中有足够的比较器制作工具来满足当前的需要,这很好听!