安卓开发之Kotlin学习——初遇高阶函数

1,483 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情

引言

前置提要

之前我们已经看过了Kotlin高阶函数的前置内容(安卓语言基础之Kotlin高阶函数——Lambda表达式(一) - 掘金 (juejin.cn)安卓语言基础之Kotlin高阶函数——Lambda表达式(二) - 掘金 (juejin.cn)),那我们可以直接去看高阶函数了吗?

Kotlin高阶函数的定义

答案是,我们还得再看两个知识点(扩展函数和运算符重载),然后就正式开始看高阶函数的知识,其实也别被唬住了,高阶函数也不是什么高大上的东西,从数学上的高阶函数来看,我们有f(x)=nx+mf(x) = nx + m,求导时,我们得到了一个常量n,而我们对f(x)=nxk+mf(x) = nx^k + m求导时,就会得到k(xk/x)k(x^k/x),最后我们都可以将这些导函数的结果换成函数形式: nx0nx^0k(xk/x)k(x^k/x),所以我们可以说求导函数的参数和结果都是函数,这就是高阶函数,其实数学中如果一个函数使用函数作为它的参数或者结果,它就被称作是一个「高阶函数」,而我们的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()就是高阶函数

总结

本文主要还是介绍了扩展函数的使用与运算符重载,高阶函数简单的说了一些,但没有具体应用,后面我会找一些具体应用环境进一步去看高阶函数的使用,以及看看一些古里古怪的高阶函数写法。