扩展函数

扩展函数可以在不修改某个类源码的情况下,仍然可以打开这个类,向该类添加新的函数。
扩展函数的语法结构

fun ClassName.methodName(param1:Int,param2:Int) : Int{
    return 0
}

假设需求:我们想统计字符串中字母的数量,如果采用java中的实现思想我们可能会这样写

object StringUtil{
    
    fun lettersCount(str:String) : Int{
        var count = 0
        for (char in str){
            if (char.isLetter()){
                count++
            }
        }
        return count
    }
}

我们希望向String类中添加一个扩展函数,因此需要创建一个String.kt文件。文件名虽然并没有固定的要求,但是建议像哪个类中添加扩展函数,就定一个同名的kotlin文件,这样方便后续查找。扩展函数也是可以定义在任何一个现有类当中的,并不一定要创建新文件。不过通常来说,最好将它定义成顶层方法,这样可以让扩展函数拥有全局的访问域。

现在在String.kt下编写代码

fun String.lettersCount():Int{
    var count = 0
    for (char in this){
        if (char.isLetter()){
            count++
        }
    }
    return count
}

现在lettersCount()方法定义成了String类的扩展函数,函数就自动拥有了String实例的上下文。因此lettersCount()函数就不用再接收一个字符串参数了,直接遍历this就可以了

定义好后可以这样使用

val count = "ABN1233xyz*(&".lettersCount()

最后顺便介绍两个kotlin自带的String类扩展函数
reverse()用于反转字符串
capitalize()用于对首字母进行大写

运算符重载

kotlin允许我们将所有的运算符甚至其他的关键字进行重载,从而拓展这些运算符和关键字的用法。
但在实际编程时要考虑合理性,比如两个Student对象相加没意义,但是两个Money有

运算符重载使用operator关键字,只要在指定函数的前面加上operator关键字就可以实现运算符重载功能了,但是指定函数是什么呢?不同运算符对应的重载函数也是不同的,比如加号运算符对应的是plus(),减号运算符对应的是minus()函数

需求:以加号运算符为例,实现让两个对象相加的功能。

class obj{
    operator fun plus(obj: Objects):Objects{
        //处理相加的逻辑
    }
}

实现money相加,首先定义money类,并重载plus

class Money(val value :Int){
    operator fun plus(money: Money):Money{
        val sum = value + money.value
        return Money(sum)
    }
}

接下来就可以这样使用了,得到的结果为9

val money1 = Money(4)
val money2 = Money(5)
val money3 = money1 + money2
println(money3.value)

现在money对象已经可以和money对象相加了,如果我们希望能够更加方便,让money对象可以直接和对象相加呢?只需要进行多重重载即可

class Money(val value :Int){
    operator fun plus(money: Money):Money{
        val sum = value + money.value
        return Money(sum)
    }
    
    operator fun plus(newValue : Int):Money{
        val sum = value + newValue
        return Money(sum)
    }
}

这样就可以直接使用数字相加了,知道money4的值为19

val money1 = Money(4)
val money2 = Money(5)
val money3 = money1 + money2
println(money3.value)
val money4 = money3 + 10

常见的语法糖表达式和实际调用函数对照表

在这里插入图片描述

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐