android - 不明白这个 Lambda 函数是如何工作的
问题描述
我是 Kotlin 的新手,几天前刚刚了解了 lambda 函数。
所以,我的理解是:
假设我有一个以 lambda 函数作为参数的函数:
class XX
{
fun addTowNumbers(a:Int , b:Int , action: (Int,Int) -> Int)
{
val result = action(a,b)
println(result)
}
}
并称之为:
fun main(args: Array<String>)
{
val x = XX();
val myLambda: (Int, Int) -> Int = {x,y -> x+y}
x.addTowNumbers(2,5, myLambda)
}
但是今天看到了一种新方法,如下所示。
拉姆达函数:
val sum: (Int, Int) -> Int = { x, y -> x + y }
将 lambda 函数用作参数的高级函数:
fun applyOp(x: Int, y: Int, op: (Int, Int) -> Int): Int = op(x, y)
并称之为:
applyOp(2, 3, sum)
所以,现在我的困惑在于高级功能。参数里怎么有2个冒号
op: (Int, Int) -> Int): Int = op(x, y)
另外,为什么有等号?
总 lambda 参数在做什么?
解决方案
这是一个带有表达式主体的函数:
fun applyOp(x: Int, y: Int, op: (Int, Int) -> Int): Int = op(x, y)
您可能习惯于看到带有块体的函数:
fun applyOp(x: Int, y: Int, op: (Int, Int) -> Int): Int { return op(x, y) }
这两个是等价的;表达式体只是一种更简洁的写法。
同样,这两个函数是相同的:
fun helloWorld(): String {
return "Hello World!"
}
fun helloWorld(): String = "Hello World!"
如果您使用表达式主体,您甚至可以关闭函数类型规范:
fun helloWorld() = "Hello World!"
推荐阅读
- swift - 应用程序的 NSExtension 在发布版本中启动时崩溃
- javascript - GCP SecretManager DEADLINE_EXCEEDED 错误代码 4
- ubuntu - JSPWiki:无法从 jspwiki.properties ubuntu1.20.04 加载和设置属性
- machine-learning - 如何在自动编码器中批量序列到序列映射?
- c# - .NET Core 工作者服务实体框架上下文
- html - 静态元素之前的 Clearfix 不会阻止浮动
- java - Flutter for Mac 上的 Java 问题
- c++ - 用 shared_ptr 替换 new/delete?
- linux - Ubuntu Linux中是否存在可以使子线程直接读取主线程的cmd参数的系统调用?
- assembly - 为什么使用汇编级语言?和汇编?