【问题标题】:How to pass a Lambda to toSortedSet() in Kotlin如何在 Kotlin 中将 Lambda 传递给 toSortedSet()
【发布时间】:2018-08-23 08:01:58
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: lambda kotlin functional-interface


    【解决方案1】:

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

    toSortedSet(compareBy { it.length })
    

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

    【讨论】:

    • 虽然这个答案是正确的,但它可能无法完全回答 OP 的真正要求,即 为什么 一个简单的 lambda 不起作用。对于简单的字段选择,compareBy 有效,但如果 OP 想要进行复杂的计算以进行比较怎么办?
    • 感谢您的解决方案。不过,正如 DodgyCodeException 指出的那样,我的实际情况要复杂一些,所以我只是将其简化为带有 Strings 的示例,因为它不接受 lambdas 的问题是相同的。
    【解决方案2】:

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

    【讨论】:

    • “既然 Kotlin 有正确的函数类型,不需要将函数自动转换为 Kotlin 接口的实现”,这不是一个很好的反例吗?所有采用Comparator 的标准库方法都应该获得重载(或扩展函数“重载”)采用函数吗?
    • @AlexeyRomanov 我们很可能会在未来的语言版本中添加对 Kotlin 接口的 SAM 转换的支持,所以我认为现在添加这些重载没有意义。并且标准库中有足够的比较器制作工具来满足当前的需求
    • 很高兴听到这个消息!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多