【问题标题】:How to use the lambda in kotlin ->如何在 kotlin 中使用 lambda ->
【发布时间】:2021-12-30 09:25:40
【问题描述】:

对 kotlin 中的 -> 有疑问。

   fun test0 (a: String, combine: (b: String) -> String ): String {
        return combine(a)
   }

上面有个例子函数,这个函数怎么用? 我不知道如何通过 parm combine。

已尝试关注:

    private fun getFold(a: String): String {
        return a
    }

    fun test() {
        var a: String = "a"
        val test1 = test0 (a,  combine = getFold(a))
    }

combine = getFold(a)) 中的同步错误,比如:

类型不匹配。必需:(字符串)→ 找到的字符串:字符串

那么如何通过parm combine呢?

【问题讨论】:

    标签: kotlin lambda


    【解决方案1】:

    在您的示例中,combine(b: String) -> String 类型的参数,该函数采用单个 String 并返回 String

    (其实你不需要将参数命名为b,可以直接写成(String) -> String。)

    将函数作为参数传递的主要方式有以下三种:

    1. 作为lambda 这可能是最常见的:您直接在大括号中提供函数体。例如:
    val test1 = test0(a, { it })
    

    这里的 lambda 是 { it }。 (it 是您可以在 lambdas 中使用的关键字,它采用单个参数,并引用该参数。 等效的可能是 { a -> a }。)

    事实上,因为函数参数是最后一个参数,Kotlin 允许你将 lambda 移到括号之后:

    val test1 = test0(a){ it }
    

    这意味着完全相同,但在某些情况下它可以更好地阅读(通过使函数调用看起来像语言语法;像 mapfilter 这样的函数通常以这种方式调用)。

    1. 作为anonymous function 这类似于 lambda,但语法更像是定义一个普通函数;它更冗长,但给你更多的控制权。在这种情况下,您可以使用普通的函数体:
    val test2 = test0(a, fun(b: String): String { return b })
    

    或表达式体:

    val test2 = test0(a, fun(b: String) = b)
    
    1. 作为callable reference 当您有想要使用的现有方法或功能时。 (您的项目或库中可能已经有合适的函数;或者代码可能太长而无法整齐地放入 lambda。)

    使用:: 运算符完成,例如:

    val test3 = test0(a, ::getFold)
    

    您可以通过这种方式引用方法、顶级函数、扩展函数、属性或构造函数。 (如果它不是顶级函数,您可能需要告诉编译器它属于哪个对象/类——就像直接调用它时一样——例如myInstance::methodName。)

    看起来这就是问题中的代码试图做的事情。但是,lambda 语法通常更简单、更清晰,因此如果出于任何其他原因不需要现有函数,请考虑一下。


    (问题中的错误信息是因为combine = getFold(a)调用getFold(),并尝试将其结果分配给combine参数。 那个结果是字符串,而不是函数类型,因此类型不匹配。)

    【讨论】:

    • 非常干净的答案。也许您可以通过训练 lambda 语法的示例来扩展 lambda 答案,例如test0(a) { it } 而不是 test0(a, { it }),这似乎是常见的做法。
    • @Endzeit 感谢您的想法! (我希望答案不会太复杂。)
    【解决方案2】:
    test0(a, combine = ::getFold)
    

    test0(a, combine = this::getFold)
    

    【讨论】:

    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
    【解决方案3】:

    或者像这样:

    combine = {getFold(it)}
    

    【讨论】:

    • 应该是it 而不是a
    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
    猜你喜欢
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2023-01-25
    • 1970-01-01
    相关资源
    最近更新 更多