Lambda函数
函数,一般包括两个部分,一部分是函数的声明,另一个部分是函数的实现。上述写的getString方法中,fun getString(input: String) : String是函数的声明,括号中的就是函数的实现。
那么Kotlin中, 怎么写一个函数的声明呢?
var getString : (String) -> String
是不是看的一头雾水,如果写出对应的Java函数的话,应该是如下的样子:
public String getString(String inputStr)
对比不难发现,kotlin和java的输入,输出的类型,是可以对的上的,只不过是呈现的方式不同。
那如果返回的不是String,而是Any,对应Java中的返回值是什么呢?
答案就是Object。
tip:在Kotlin中,没有基本数据类型,只有引用数据类型(Int,Double…),但是在反编译成java字节码的时候,会变成int,double等。
到目前为止,只有函数的声明,还不能直接调用
如何写一个声明 + 实现的函数
var getString = {
println(“hello kotlin”)
}
- 如上,就是一个包括了声明和实现的函数
如果在kotlin中看不懂,我们写出同等的java代码看看,分析一下,功能就是简单的打印hello kotlin:
public void getString() {
System.out.println(“hello kotlin”);
}
值得注意的是,Kotlin的类型推导帮助我们省略了函数的类型,其实写全了是如下的样子:
var getString : () -> Unit = {
println(“hello kotlin”)
}
此处有没有一点疑惑,为什么类型推导得出的类型是 () -> Unit ?
此时只要回头看一下Kotlin中函数是如何声明的,就知道为什么了。
为什么这里的函数不是fun开头的
-
其实这里的函数是匿名函数,上述的写法就是把这个匿名函数赋值给了变量。
-
可以直接使用变量名进行调用或者使用invoke,方式如下:
fun main() {
val getString : () -> Unit = {
println(“hello kotlin”)
}
getString()
getString.invoke()
}
- 两种方式都可以成功调用,这里的()其实是invoke操作符的重载。
var getString = {“this is kotlin”} 是什么意思
跑一下上面的代码,看看运行结果是啥
fun main() {
val getString = {
“hello kotlin”
}
print(getString.invoke())
}
-
结果打印了hello kotlin。
-
在括号中,最后一行将会作为返回值。如果把代码修改为下面的样子
fun main() {
val getString = {
“hello kotlin”
666
}
print(getString.invoke())
}
返回值就成了666。 如果最后一行是函数,则就成了函数中的函数,也就是高阶函数。
稍微复杂一点
val testPlus = {number1: Int, number2: Int -> number1 + number2}
- 这个函数中,number1和number2分别作为两个参数,函数的功能是number1+number2,则返回值的类型就是Int。相当于Java中的
public int testPlus(int number1, int number2) {
return number1 + number2;
}
再复杂一点
刚刚提到了,函数分为声明和实现两个部分。那么自然就可以先声明再实现。
先声明:
val getString : (Int) -> String
再实现:
getString = fun(number) = number.toString()
- 声明的时候,参数类型为Int,返回值为String。实现的时候,number会被自动推导为int,函数实现要返回String类型,如果toString换成toShort,编译器就会报错。
如果把成整体就是下面的样子:
fun main() {
val getString : (Int) -> String = fun(number) = number.toString()
getString
}
写在最后
本次我的分享也接近尾声了,感谢你们在百忙中花上一下午来这里聆听我的宣讲,希望在接下来的日子,我们共同成长,一起进步!!!
最后放上一个大概的Android学习方向及思路(详细的内容太多了~),提供给大家:
对于程序员来说,要学习的知识内容、技术有太多太多,这里就先放上一部分,其他的内容有机会在后面的文章向大家呈现出来,不过我自己所有的学习资料都整理成了一个文档,一直在不断学习,希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!
Android架构师之路很漫长,一起共勉吧!
如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!**
Android架构师之路很漫长,一起共勉吧!
如果你觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。
[外链图片转存中…(img-Zk47PNad-1715575977025)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!