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

时间:2018-08-23 08:01:58

标签: lambda kotlin functional-interface

我有点困惑为什么这不起作用。我有一个Animations中的简单override fun onAnimationStart(fragment: Fragment, animation: Animation, enter: Boolean) { if (fragment == newFragment) { toolbar.animation = animation } } ,我想以自己的方式通过Iterable进行排序。我想像这样传递一个lambda:

String

但是,这似乎不起作用。错误提示

  

类型不匹配。必需的kotlin.Comparator

     

找到:(String,String)-> Int

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

toSortedSet(compareBy { it.length })

我认为在您的情况下,toSortedSet不需要争论。

答案 3 :(得分:0)

不确定这是否是新的,但是您可以这样做:

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