Kotlin学习(7)→函数高级


在期待着郭霖先生的**《第一行代码(第三版)》**时,意识到自己需要补充必要的Kotlin知识。现在写文章分享自己学习Kotlin基础知识的过程,争取拿到书之后能早日上手。
使用的软件是IDEA 2019,文章中如有错误或者欠缺的地方,欢迎批评指正。
(参考书为《Kotlin从零到精通Android开发》,欧阳燊著,清华大学出版社2018年4月第一版,ISBN 978-7-302-49814-8)。感谢欧阳先生的优秀教材。

文章来源于 我的简书

1、泛型函数

所谓泛型,就是输入参数类型预先不知道,调用的时候再指定的函数。之前遇到过这样的情况,使用Array来声明数组类型,再通过arrayOf()进行定义,T就是输入参数类型,这样,只用写一个函数,就能够适用于多种参数类型的情况,极大地拓展了函数的适用范围。
定义泛型函数时,需要在函数名前面加
< T >
,表示以T声明的参数(包括输入参数和输出参数),并且要在函数调用时指定参数的类型。例如:
泛型函数例子
可以看到,这里定义了一个泛型函数printInfo,用于输出各种类型的数据(实际上就是变相的print)。
如果函数需要适用于所有的数据类型,那么就需要将函数指定为泛型。例如后面的系统拓展函数。
可以这样理解:我不愿意在函数声明时就指定函数中的变量或者返回值的类型,就可以声明泛型函数,此时泛型函数声明关键字为fun,这个T就是一个类型,我现在还没有指定。

2、递归函数

递归实际上是一种解题的思路,Kotlin中也可以有递归,例如经典的递归计算阶乘的函数。

3、函数变量

Kotlin中支持函数变量,例如将函数A作为参数给函数B,这样函数B就可以使用函数A。
有些人认为,在一个类中,不同的成员函数之间本身就可以相互调用了,我为什么还要将函数作为参数传进去让另一个函数调用呢?的确如此,但是函数变量有它自己的优势。
实际上,这里传进的函数,一般是指lambda表达式。例如,字符串的比较大小有两种比较规则,一种是比较字典顺序,另一种是比较字符串长度。现在有一个函数roof,需要在不同的情况下,分别利用这两种规则来进行某种逻辑处理,那么,为了这一个函数roof来写两个字符串比较函数是很不方便的,Kotlin的函数变量为这一问题提供了更为简单的思路,请看下面的例子:
函数变量的例子
输出结果
Kotlin支持lambda表达式,在printMessage函数里,首先给出了函数的参数列表和返回值类型:
(参数列表)->返回值
例如,give:(String,String)->Boolean这样的写法,表示有一个函数变量give,它接受两个String类型的参数,并返回一个Boolean值。
在printMessage函数内部,就可以写下需要用judge函数实现怎样的逻辑:
我这里是,调用judge函数,根据返回值的true或者false,对应输出函数的另外两个参数。
接着,在调用printMessage函数时,就可以指定具体的judge函数了(采用lambda表达式构建匿名函数)。第一次调用,指定的函数是**{a,b->a.length>b.length}**,这里a,b是自己起的参数的名字,类型和声明中的judge参数对应,意思是返回a.length>b.length对应的布尔值。注意,只有不可空类型String才有length方法。
更普遍的情况是将这种函数变量使用泛型,使用函数变量的函数指定为泛型函数。
第一次调用,是通过比较字符串长度确定大小;第二次调用,则是比较字典序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值