开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情
引言
前置提要
之前我们已经看过了Kotlin高阶函数的前置内容(安卓语言基础之Kotlin高阶函数——Lambda表达式(一) - 掘金 (juejin.cn)与安卓语言基础之Kotlin高阶函数——Lambda表达式(二) - 掘金 (juejin.cn)),那我们可以直接去看高阶函数了吗?
Kotlin高阶函数的定义
答案是,我们还得再看两个知识点(扩展函数和运算符重载),然后就正式开始看高阶函数的知识,其实也别被唬住了,高阶函数也不是什么高大上的东西,从数学上的高阶函数来看,我们有,求导时,我们得到了一个常量n,而我们对求导时,就会得到,最后我们都可以将这些导函数的结果换成函数形式: 与,所以我们可以说求导函数的参数和结果都是函数,这就是高阶函数,其实数学中如果一个函数使用函数作为它的参数或者结果,它就被称作是一个「高阶函数」,而我们的Kotlin中,参数有函数类型或者返回值是函数类型的函数就被称之为「高阶函数」。
言归正题
我们在这首先还是先把两个知识点——“扩展函数和运算符重载” 了解一番,这是既比较简单,也比较麻烦的知识点:
Kotlin扩展函数
通常情况下,比如我们需要计算字符串的字母个数,忽略字符数字,我们可以定义一个工具类,而工具类的定义选择,我们之前通过Java开发知道一般做成单例比较好,而且Kotlin写单例也简单,加上object关键字然后写方法就行:
class StudyTest {
object StringUtil {
fun stringCount(string: String) : Int {
var count = 0
for (char in string) {
if (char.isLetter()) {
count++
}
}
return count
}
}
}
调用也蛮简单:
StudyTest.StringUtil.stringCount("cc666aa,aa")
而Kotlin的扩展函数可以让我们有第二种写法,如下:
fun String.letterCount() : Int {
var count = 0
for (char in this) {
if (char.isLetter()) {
count++
}
}
return count
}
上述代码要放在当前类外面实现定义,否则其他类里面无法直接调用的。 调用也很简单:
"cc666aa,aa".letterCount()
扩展方法的通用定义:
fun ClassName.方法名(参数1:参数类型,... ) : 返回类型 {
...(方法体)
return 对应返回类型
}
这种形式的方法定义可以扩展我们一些类的函数,提高了类的灵活度,也更方便使用。
运算符重载简单提要
Kotlin中运算符的重载主要麻烦不是要加关键字operator去定义方法而是要了解自己需要重载的运算符号的对应指定函数,比如常用的相加,我们应该重载plus()函数,而相减则应该重载minus()函数,下面是让两个对象相加的重载样例:
class StudyTest(val value : Int) {
operator fun plus(obj : StudyTest) : StudyTest {
val sum = value + obj.value
return StudyTest(sum)
}
}
调用方法:
val test1 = StudyTest(1)
val test2 = StudyTest(2)
val test = test1 + test2
就和普通的数值加法一样调用。
介绍完上面两个,我们正式去看看Kotlin高阶函数。
Kotlin高阶函数简单使用方法
函数类型的语法规则如下:
(String, Int) -> Unit
刚看到上面这个定义方式,也很难看明白,所以解释一下,通过->分成左右两部分,左边部分是用来声明该函数接受什么参数,如果没有参数接受,就直接写(),里面空着即可,右边是用来声明该函数的返回值类型,而Unit大概相当于Java的void,即没有返回。
具体例子:
fun example(func : (String, Int) -> Unit) {
func("name", 666)
}
通过上面例子我们可知,Kotlin中可以把函数当成一个函数类型的参数传入,而上面的例子example()就是高阶函数
总结
本文主要还是介绍了扩展函数的使用与运算符重载,高阶函数简单的说了一些,但没有具体应用,后面我会找一些具体应用环境进一步去看高阶函数的使用,以及看看一些古里古怪的高阶函数写法。