如何在 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
就可以了。)
函数作为参数传递的方式主要有以下三种:
- 作为 lambda.‖这可能是最常见的:您直接在大括号中提供函数体。例如:
val test1 = test0(a, { it })
这里的 lambda 是 { it }
。 (it
是一个关键字,您可以在带有单个参数的 lambda 中使用,并引用该参数。 等价物可能是 { a -> a }
。)
事实上,因为函数参数是最后一个参数,Kotlin 允许您将 lambda 移到 parens 之后:
val test1 = test0(a){ it }
这意味着完全相同,但在某些情况下它可以更好地阅读(通过使函数调用看起来像语言语法;像 map
and filter
这样的函数通常被这样调用)。
- As an anonymous function.‖这类似于lambda,但语法更像是定义一个普通函数;它更冗长,但给了你更多的控制权。在这种情况下,您可以使用普通函数体:
val test2 = test0(a, fun(b: String): String { return b })
或表达式主体:
val test2 = test0(a, fun(b: String) = b)
- As a callable reference.‖ 这适用于当您有想要使用的现有方法或函数时。 (您的项目或库中可能已经有合适的函数;或者代码可能太长而无法整齐地放入 lambda。)
使用 ::
运算符完成,例如:
val test3 = test0(a, ::getFold)
您可以通过这种方式引用方法、顶级函数、扩展函数、属性或构造函数。 (如果它不是顶级函数,您可能需要告诉编译器它属于哪个 object/class — 就像直接调用它时一样 — 例如 myInstance::methodName
。)
看起来这就是问题中的代码试图做的事情。但是,lambda 语法通常更简单、更清晰,因此如果您出于任何其他原因不需要现有函数,请考虑。
(题中的错误信息是因为combine = getFold(a)
会调用getFold()
,并尝试赋值其结果 到 combine
参数。结果是字符串,而不是函数类型,因此类型不匹配。)
对 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
就可以了。)
函数作为参数传递的方式主要有以下三种:
- 作为 lambda.‖这可能是最常见的:您直接在大括号中提供函数体。例如:
val test1 = test0(a, { it })
这里的 lambda 是 { it }
。 (it
是一个关键字,您可以在带有单个参数的 lambda 中使用,并引用该参数。 等价物可能是 { a -> a }
。)
事实上,因为函数参数是最后一个参数,Kotlin 允许您将 lambda 移到 parens 之后:
val test1 = test0(a){ it }
这意味着完全相同,但在某些情况下它可以更好地阅读(通过使函数调用看起来像语言语法;像 map
and filter
这样的函数通常被这样调用)。
- As an anonymous function.‖这类似于lambda,但语法更像是定义一个普通函数;它更冗长,但给了你更多的控制权。在这种情况下,您可以使用普通函数体:
val test2 = test0(a, fun(b: String): String { return b })
或表达式主体:
val test2 = test0(a, fun(b: String) = b)
- As a callable reference.‖ 这适用于当您有想要使用的现有方法或函数时。 (您的项目或库中可能已经有合适的函数;或者代码可能太长而无法整齐地放入 lambda。)
使用 ::
运算符完成,例如:
val test3 = test0(a, ::getFold)
您可以通过这种方式引用方法、顶级函数、扩展函数、属性或构造函数。 (如果它不是顶级函数,您可能需要告诉编译器它属于哪个 object/class — 就像直接调用它时一样 — 例如 myInstance::methodName
。)
看起来这就是问题中的代码试图做的事情。但是,lambda 语法通常更简单、更清晰,因此如果您出于任何其他原因不需要现有函数,请考虑。
(题中的错误信息是因为combine = getFold(a)
会调用getFold()
,并尝试赋值其结果 到 combine
参数。结果是字符串,而不是函数类型,因此类型不匹配。)