写点什么

Kotlin 从头开始(一):lambda 表达式和高阶函数 一

用户头像
Android架构
关注
发布于: 5 小时前

到目前为止,只有函数的声明,还不能直接调用


如何写一个声明 + 实现的函数


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 : () -


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


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


}


tip:上述代码中,把鼠标悬停在 getString 的调用上,按下 Shift+Ctrl+P,就成看到 getString 的参数和返回值。



那么,这么写有什么好处呢?


除了装 b,大概是没有其他用处的。


茴字的最后一种写法


声明和实现一起写,应该怎么写呢


val getString : (Int, String) -> String = {values, str -> "value is str"}


  • values 是 Int 类型,str 是 String 类型,返回值是 String 类型


还能再简化一点吗


能,但是只能有一个参数


val getString : (String) -> Unit = {


println("string is $it")


}

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Kotlin从头开始(一):lambda表达式和高阶函数 一