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

相关推荐
有点感觉2 小时前
Android级联选择器,下拉菜单
kotlin
zhangphil9 小时前
Android Coil3缩略图、默认占位图placeholder、error加载错误显示,Kotlin(1)
android·kotlin
xvch15 小时前
Kotlin 2.1.0 入门教程(二十三)泛型、泛型约束、协变、逆变、不变
android·kotlin
xvch2 天前
Kotlin 2.1.0 入门教程(二十四)泛型、泛型约束、绝对非空类型、下划线运算符
android·kotlin
zhangphil3 天前
Android Coil ImageLoader MemoryCache设置Key与复用内存缓存,Kotlin
android·kotlin
mmsx3 天前
kotlin Java 使用ArrayList.add() ,set()前面所有值被 覆盖 的问题
android·开发语言·kotlin
lavins3 天前
android studio kotlin项目build时候提示错误 Unknown Kotlin JVM target: 21
jvm·kotlin·android studio
面向未来_3 天前
JAVA Kotlin Androd 使用String.format()格式化日期
java·开发语言·kotlin
alexhilton3 天前
选择Retrofit还是Ktor:给Android开发者的指南
android·kotlin·android jetpack
GordonH19913 天前
Kotlin 优雅的接口实现
android·java·kotlin