如何在 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
将代码包装到 Comparator
s:
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
})
我有点困惑为什么这不起作用。我有一个简单的 Iterable
of String
,我想通过 toSortedSet()
我自己的方式进行排序。我想像这样向它传递一个 lambda:
myStringIterable.toSortedSet({a,b -> a.compareTo(b)})
然而,这似乎不起作用。错误说
Type mismatch. Required kotlin.Comparator < String>
Found: (String,String) -> Int
比较器是一个函数式接口,所以我应该能够将它作为 Lambda 传递,不是吗?
您可以使用 compareBy
将代码包装到 Comparator
s:
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
})