如何在 kotlin 中使用 lambda ->

How to use the lambda in kotlin ->

对 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呢?

test0(a, combine = ::getFold)

test0(a, combine = this::getFold)

或者像这样:

combine = {getFold(it)}

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

(其实不用给参数起名字b,直接写成(String) -> String就可以了。)

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

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

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

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

val test1 = test0(a){ it }

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

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

或表达式主体:

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

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

val test3 = test0(a, ::getFold)

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

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


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