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的函数的输入参数与返回可以也可以是函数的特性,可以组合出更多的玩法。可以使得在代码的编写上都会更加简洁与便捷。

相关推荐
老码沉思录5 小时前
Android开发实战班 - Android开发基础之 Kotlin语言基础与特性
android·微信·kotlin
闲暇部落2 天前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
长亭外的少年2 天前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
JIAY_WX2 天前
kotlin
开发语言·kotlin
麦田里的守望者江3 天前
KMP 中的 expect 和 actual 声明
android·ios·kotlin
菠菠萝宝3 天前
【YOLOv8】安卓端部署-1-项目介绍
android·java·c++·yolo·目标检测·目标跟踪·kotlin
恋猫de小郭3 天前
Kotlin Multiplatform 未来将采用基于 JetBrains Fleet 定制的独立 IDE
开发语言·ide·kotlin
枫__________3 天前
kotlin 协程 job的cancel与cancelAndJoin区别
android·开发语言·kotlin
鸠摩智首席音效师4 天前
如何在 Ubuntu 上配置 Kotlin 应用环境 ?
linux·ubuntu·kotlin
jikuaidi6yuan5 天前
Java与Kotlin在鸿蒙中的地位
java·kotlin·harmonyos