Kotlin函数与Lambda表达式深入
Kotlin函数:
关于Kotlin函数在之前也一直在用,用fun来声明,回忆下:

下面再来整体对Kotlin的函数进行一个学习。
默认参数(default arguments):
先来定义一个函数:

相比java不一样的就是可以给参数增加默认参数,如下:

接一来调用一下该函数:

接下来还可以这样调用:

运行一下:

不过还有一个显示指定参数的方式,这样可读性比较强:

当然还可以都传啦:

其中上面调用两个参数的这个写法可以简化为:

当然还可以正常的调用:

可见相比Java,Kotlin对于函数提供了更加灵活的特性。
重写方法默认值:
情况一:
先来说下结论:“对于重写的方法来说,子类所拥有的重写方法会使用与父类相同的默认参数值。在重写一个拥有默认参数值的方法时,方法签名中必须要将默认参数值省略掉。” 啥意思,下面用代码来进行说明:
先定义一个父类:

再定义其子类:

其中来理解一下刚才说的话:“对于重写的方法来说,子类所拥有的重写方法会使用与父类相同的默认参数值。”,也就是说对于子类重写了父类的方法,而对于参数b在父类中是有默认值的,对于子类来说也会有相同的默认值,那我能否给子类的b显示的指定一个默认值呢,咱们试一下:

这就应证了另外一句话:“在重写一个拥有默认参数值的方法时,方法签名中必须要将默认参数值省略掉。”,好下面来调用一下:

情况二:
先来看下说明:“如果一个默认参数位于其它无默认值的参数前面,那么默认值只能通过在调用函数时使用具名参数【named argument,也就是显示的指定参数名】的方式来使用。”,下面定义一个函数:

假如我们不显示指定参数名呢?

Lambda表达式:
对于Kotlin的Lambda表达式跟Java8其实差不多,不过也有它独特的地方,下面先来定义一个带Lambda表达式参数的方法:

接下来调用一下:

目前我们传的Lambda表达式是已经定义好的函数,接下来我们可以动态的进行Lambda表达式的传递,这里注意了,此时跟Java8的写法就不太一样了,如下:

这里可以发现,在Kotlin中的Lambda参数不需要写在小括号中,如下:

另外整个Lambda表达式需要写在大括号中,去掉的话也会报错:

其实对于这个方法在Kotlin的Lambda写法中还有这么一个规则:“如果一个方法最后一个参数是一个Lambda表达式,那么在调用该方法时传递最后一个参数时Lambda表达式时可以放置在一个方法的执行体中。”,其实这个我们在之前已经使用过了,下面来看一下:

由于目前test3中有定义默认值我们还木有使用,所以下面使用一下:

最后咱们一个参数都不传,再看下:

发现表现上其参数变成了方法的执行体了。。其实这种特性在现代语言如swift中也有类似的支持,这种写法也是在使用Kotlin中用得最多的,反而放在圆括号传参的方式用得不多。
这里有个注意点了,我们之前对于这个函数:

它需要满足这个规则:“如果一个默认参数位于其它无默认值的参数前面,那么默认值只能通过在调用函数时使用具名参数【named argument,也就是显示的指定参数名】的方式来使用。”,那貌似这条规则不适应于带有Lambda表达式的test3了,如下:

所以,这里对带Lambda表达式的方法需要总结一下:“如果函数的最后一个参数是Lambda表达式,而且在调用时是位于圆括号之外,那么就可以不为默认参数传值,换言之,也就是可以不指定Lambda表达式的具名参数名。”
Kotlin函数与Lambda表达式深入的更多相关文章
- Kotlin语法(函数和lambda表达式)
三.函数和lambda表达式 1. 函数声明 fun double(x: Int): Int { } 函数参数是用 Pascal 符号定义的 name:type.参数之间用逗号隔开,每个参数必须指明类 ...
- 《疯狂Kotlin讲义》读书笔记6——函数和Lambda表达式
函数和Lambda表达式 Kotlin融合了面向过程语言和面向对象语言的特征,相比于Java,它增加了对函数式编程的支持,支持定义函数.调用函数.相比于C语言,Kotlin支持局部函数(Lambda表 ...
- 浅析匿名函数、lambda表达式、闭包(closure)区别与作用
浅析匿名函数.lambda表达式.闭包(closure)区别与作用 所有的主流编程语言都对函数式编程有支持,比如c++11.python和java中有lambda表达式.lua和JavaScript中 ...
- 委托,匿名函数和lambda表达式
很早之前就接触到了委托,但是一直对他用的不是太多,主要是本人是菜鸟,能写的比较高级的代码确实不多,但是最近在看MSDN微软的类库的时候,发现了微软的类库好多都用到了委托,于是决定好好的研究研究,加深一 ...
- 匿名函数:Lambda表达式和匿名方法
匿名函数一个"内联"语句或表达式,可在需要委托类型的任何地方使用.可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数. 共有两种匿名函数: Lamb ...
- python函数,lambda表达式,三目运算,列表解析,递归
一.自定义函数 定义函数时,函数体不执行:只有在调用函数时,函数体才执行.函数的结构: 1. def 2. 函数名 3. 函数体 def func_name(): 函数体 4. 返回值 如果没有声明返 ...
- python3 入门 (三) 函数与lambda表达式、闭包
函数 是组织好的.可重复使用的.用来实现单一或相关联功能的代码段. 函数代码块以def关键词开头,后接函数标识符名称和圆括号() 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数 函 ...
- 3 委托、匿名函数、lambda表达式
委托.匿名函数.lambda表达式 在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法.C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方 ...
- C#语法之匿名函数和Lambda表达式
上一篇博客主要是对委托和事件做了一小结,这篇是在上一篇博客的基础上对匿名函数和Lambda表达式小结.还是接着上一篇说起,在上一篇中也说了委托是一种数据结构,主要是解决让函数作为参数的问题.在使用委托 ...
随机推荐
- 关于C#编写x86与x64程序的分析
电脑硬件CPU可以分为x86与x64, x86的机器只能安装32位的操作系统,如XP, WIN7_86, x64的机器既可以安装32位的系统,又可以安装64位的系统,只是在x64的机器上安装32位的系 ...
- RubyGem镜像/ruby国内镜像
RubyGem 网上推荐的淘宝的镜像已经无法访问 清华镜像 # 添加 TUNA 源并移除默认源 gem sources --add https://mirrors.tuna.tsinghua.edu. ...
- [ARM-LInux开发]linux设备驱动makefile入门解析
以下内容仅作参考,能力有限,如有错误还请纠正.对于一个普通的linux设备驱动模块,以下是一个经典的makefile代码,使用下面这个makefile可以完成大部分驱动的编译,使用时只需要修改一下要编 ...
- 实现CI/CDk8s高可用集群搭建总结以及部署API到k8s
实现CI/CD(Centos7.2)系列二:k8s高可用集群搭建总结以及部署API到k8s 前言:本系列博客又更新了,是博主研究很长时间,亲自动手实践过后的心得,k8s集群是购买了5台阿里云服务器部署 ...
- Mysql update多表联合更新
下面我建两个表,并执行一系列sql语句,仔细观察sql执行后表中数据的变化,很容易就能理解多表联合更新的用法 student表 ...
- kafka 如何保证数据不丢失
一般我们在用到这种消息中件的时候,肯定会考虑要怎样才能保证数据不丢失,在面试中也会问到相关的问题.但凡遇到这种问题,是指3个方面的数据不丢失,即:producer consumer 端数据不丢失 b ...
- 【C语言】学不会的指针
指针 前言: 指针是C语言程序的核心,刚开始学指针,嗯....这样呀,貌似不难呀:之后开始用指针,&p,p,*p,**p,这些指针在用的时候,额.....什么东东?每次都要想半天,特别是遇到双 ...
- sublime text 疑难解决
sublime text 白色边框方框解决方法 https://blog.csdn.net/weixin_43228019/article/details/82766316 Sublime Text提 ...
- 【LEETCODE】64、链表分类,medium&hard级别,题目:2,138,142,23
package y2019.Algorithm.LinkedList.medium; import y2019.Algorithm.LinkedList.ListNode; /** * @Projec ...
- Spark之RDD容错原理及四大核心要点
一.Spark RDD容错原理 RDD不同的依赖关系导致Spark对不同的依赖关系有不同的处理方式. 对于宽依赖而言,由于宽依赖实质是指父RDD的一个分区会对应一个子RDD的多个分区,在此情况下出现部 ...