如何在 kotlin 中使用 lambda ->

Mat*_*rix 2 lambda kotlin

对 kotlin 中的 -> 有疑问。

\n
   fun test0 (a: String, combine: (b: String) -> String ): String {\n        return combine(a)\n   }\n
Run Code Online (Sandbox Code Playgroud)\n

上面有一个示例函数,如何使用这个函数?\n我不知道如何传递 parm 组合。

\n

已尝试遵循:

\n
    private fun getFold(a: String): String {\n        return a\n    }\n\n    fun test() {\n        var a: String = "a"\n        val test1 = test0 (a,  combine = getFold(a))\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

merge = getFold(a)) 中的同步错误,例如:

\n

类型不匹配。必需:(字符串)\xe2\x86\x92 找到字符串:字符串

\n

那么如何传递 parm 组合呢?

\n

gid*_*dds 5

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

\n

(事实上​​,您不需要命名参数b;可以简单地编写它(String) -> String。)

\n

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

\n
    \n
  1. 作为lambda\xe2\x80\x82这可能是最常见的:直接在大括号中提供函数体。\xe2\x80\x82例如:
  2. \n
\n
val test1 = test0(a, { it })\n
Run Code Online (Sandbox Code Playgroud)\n

这里的 lambda 是{ it }.\xe2\x80\x82(it是一个可以在带有单个参数的 lambda 中使用的关键字,并引用该参数。\xe2\x80\x82 等效的可能是{ a -> a }。)

\n

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

\n
val test1 = test0(a){ it }\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
    \n
  1. 作为匿名函数\xe2\x80\x82这类似于 lambda,但语法更像是定义一个普通函数;它更详细,但给你更多的控制权。\xe2\x80\x82在这种情况下你可以使用普通的函数体:
  2. \n
\n
val test2 = test0(a, fun(b: String): String { return b })\n
Run Code Online (Sandbox Code Playgroud)\n

或者一个表达式体:

\n
val test2 = test0(a, fun(b: String) = b)\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 作为可调用的参考\xe2\x80\x82 这适用于当您有想要使用的现有方法或函数时。\xe2\x80\x82(您的项目或库中可能已经有合适的函数;或者代码可能是太长,无法整齐地放入 lambda 中。)
  2. \n
\n

这是使用::运算符完成的,例如:

\n
val test3 = test0(a, ::getFold)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

看起来这就是问题中的代码试图执行的操作。\xe2\x80\x82但是,lambda 语法通常更简单、更清晰,因此请考虑如果您出于任何其他原因不需要现有函数。

\n
\n

(问题中的错误消息是因为combine = getFold(a)will call getFold(),并尝试将其结果分配给combine参数。\xe2\x80\x82该结果是一个字符串,而不是函数类型,因此类型不匹配。)

\n