kotlin里的lambda表达式

kotlin里的lambda表达式

导读

当开始学习kotlin的时候,特别是从传统语言转过来开发kotlin的同学,或者是从零开始学习kotlin的同学,非常困惑的,估计是一些以前没见过的,或者比较少用的一些语法糖。在这些语法糖中,虽然不影响代码的粗粒度的逻辑分析,但在分析细节的时候,却会往往搞不清楚参数的传递方向或者调用逻辑,会使得自己产生非常大的困惑,从而在学习的时候担误不少的时间。所以就希望能过这篇文章重新整理一下自己的思绪。 ##常见的语法糖

函数简化

在kotlin中,函数的声明或者使用,还是比较简单的,语法基本上与其他语言一致,只是关键词有一定差别。

kotlin 复制代码
fun sum(a: Int, b: Int):Int{
    return a + b;
}
#调用
sum(2,3); //输出 :5

从上述例子比较容易得到函数定义及调用的模板为

kotlin 复制代码
关键字 函数名称(入参名称:入参类型):返回类型{
    //逻辑代码
    return 返回值
}
#调用方式
函数名称(入参);
```kotlin
当一个函数中,逻辑代码只有一个表达式的情况下,可以省略掉大括号,用等号代替。
```kotlin
fun sum1(a: Int, b: Int):Int = a + b;
#调用
sum1(3,4);//输出7

在返回值的类型确定的情况下,返回类型也可以省略

kotlin 复制代码
fun sum2(a: Int, b: Int) = a + b;
#调用
sum2(3,4);//输出7

lambda表达式

当前流行的语言中,无一例外,都会支持lambda表达式,并且基于lambda表达式还可以有很多高阶的玩法。kotlin是一个集多种语言优点于一身的语言,所以明显地也支持lambda表达式。一个简单的lambda表达式如下

css 复制代码
{x:Int -> x+3}

一个lambda表达式的所有代码包含在一对{}中,使用->作为分隔,-> 左边的是参数(x:Int),一个lambda表达式可以有一个或多个参数,也可以没有参数。如果一个lambda表达式不需要输入参数的话,那么包括->符号之前的所有代码都不需要,只保留主体逻辑代码即可 ->的右边的是主体逻辑代码,不限行数,其中最后一行代码作为返回值返回

将表达式赋给变量

还是上述的例子,当将上述代码赋给一个变量的时候,变量获取到的,不是该表达式的返回值,而是该表达式的地址。相当于是给上述例子的加了个别名。

kotlin 复制代码
val add={x:Int -> x+3}

此时则可以通过该别名来调用该表达式

kotlin 复制代码
add(2); //2+3,输出:5

lambda表达式的类型

接着上面的例子,在我们定义变量的时候,完整的语法是会带上类型的,如 val a:Int =2,这里a的类型就是Int,如果kotlin的编译器可以推导出变量的类型,则可以忽略掉类型的定义,直接写成val a=2。那么上面的例子的完整写法是怎样的呢。 其实lambda表达式也是一种类型,只要能让编译器知道输入、输出是什么类型,有几个输入参数即可。上述例子的输入是一个Int,返回的也是一个Int,那么他的类型为(Int)->Int,完整的写法则是这样: """kotlin val add:(Int)->Int ={x:Int -> x+3} """ 逻辑主体的的类型可以从变量的类型推导得出,所以可以省略掉也是没有问题的。 """kotlin val add:(Int)->Int ={x -> x+3} """

lambda中的it

在看网上的一些kotlin代码例子的时候,经常会看到有it 这个变量,it 这个变量怎么来的呢?当一个lambda表达式中,只有一个输入参数,并且该参数的类型编译器是可以推导出来的,那么在{}里,->前面部分可以省略掉,并用it变量来替代输入的形参,所以上述例子可以修改为这样: """kotlin val add:(Int)->Int ={it+3} """

总结

lambda表达式的基础基本上由上述特性组成,结合kotlin的函数的输入参数与返回可以也可以是函数的特性,可以组合出更多的玩法。可以使得在代码的编写上都会更加简洁与便捷。

相关推荐
RainyJiang21 小时前
谱写Kotlin协程面试进行曲-进阶篇(第二乐章)
面试·kotlin·android jetpack
星霜笔记1 天前
GitMob — 手机端 GitHub 管理工具
android·kotlin·github·android jetpack
android_cai_niao1 天前
OkHttp 使用教程:从入门到精通(Kotlin)
okhttp·kotlin
Yang-Never2 天前
OpenGL ES ->YUV图像基础知识
android·java·开发语言·kotlin·android studio
idealzouhu2 天前
【Kotlin】 数据流完全指南:冷流、热流与 Android 实战
android·开发语言·kotlin
常利兵2 天前
Android 字体字重设置:从XML到Kotlin的奇妙之旅
android·xml·kotlin
idealzouhu2 天前
【Kotlin】快速理解协程
kotlin
hnlgzb2 天前
Gemini:kotlin这几个类型有什么区别?类比java的文件,是怎样的?
java·开发语言·kotlin
hnlgzb2 天前
kotlin安卓app中,当一个类继承ViewModel类的时候,这个类是想干什么?
android·开发语言·kotlin
新镜2 天前
【Kotlin】StateFlow / MutableStateFlow只有值不相等时才会发射
kotlin