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

How to pass a Lambda to toSortedSet() in Kotlin

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

myStringIterable.toSortedSet({a,b -> a.compareTo(b)}) 

然而,这似乎不起作用。错误说

Type mismatch. Required kotlin.Comparator < String>

Found: (String,String) -> Int

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

您可以使用 compareBy 将代码包装到 Comparators:

toSortedSet(compareBy { it.length })

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

从 Kotlin 1.2 开始,仅 Java 接口支持 SAM 转换。 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
    }
}) 

或者像这样:

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 set = listOf("a", "c", "b").toSortedSet(Comparator { s1, s2 ->
    s1.compareTo(s2) // replace with own logic
})