Kotlin - 扩展函数和运算符重载

一、扩展函数

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

下面举例一个功能,比如一段字符串中可能包含字符、数字和特殊字符,现在我们希望统计字符串中的字母数量,要怎么实现这个功能呢? 参考一段代码:

object StringUtil {


    fun lettersCount(str: String): Int {

        var count = 0

        for (c in str) {
            if (c.isLetter()) {
                count++
            }
        }
        return count
    }


}
    val str = "ABC123xyz!@#"
        val lettersCount = StringUtil.lettersCount(str)

这种写法绝对可以正常工作,并且这也是JAVA语言中最标椎的实现思维。在Kotlin里有了扩展函数之后就不一样了,比如在Kotlin中可以将lettersCount()函数添加到String类中。

下面我们参考一下扩展函数的语法结构:

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

相比于定义一个普通函数,扩展函数只需要在函数名前面加上一个ClassName.的语法结构,就表示该函数添加到指定的类当中了。

下面我们由String类距离进行编写,因此我们需要先创建一个String.kt 文件。文件名虽然并没有固定的要求,作者建议向那个类中添加扩展函数,就定义一个同名的Kotlin文件,这样方便以后查找,扩展函数可以定义在任何一个现有的类中,并不一定要创建新的文件,通常我们最好把它定义成顶层方法,这样方便全局访问。

fun String.lettersCount(): Int {

    var count = 0;
    for (c in this) {
        if (c.isLetter()) {
            count++
        }
    }
    return count
}

我们将lettersCount方法定义成String的扩展函数,那么函数中就自动拥有了String实例的上下文,因此lettersCount函数就不需要接受一个字符串参数了。直接遍历this即可。

定义好扩展函数后,统计某个字符串的字母数量就可以这样写:

        val str = "ABC123xyz!@#".lettersCount()

二、运算符重载

在Java中许多语言内置的运算符关键字,如:+-*/%++ --。而Kotlin允许我们将所有的运算符甚至其他的关键字重载,从而拓展这些运算符和关键字的用法。

运算符重载的关键字使用的事operator关键字,只要在指定函数前面加上operator关键字,就可以实现运算符重载的功能了。但问题在于这个指定的函数是什么?这是运算符重载里面比较复杂的一个问题,因为不同的余生南孚对应的重载函数也是不同的,比如加号运算符对应的是plus()函数,减号运算符对应的是minus()函数。

如果两个对象实现相加功能,那么它的语法结构如下:

class Obj {


    operator fun plus(obj: Obj){
        //处理相加逻辑

    }

}

关键字operator和plus都是固定不变的,而切手参数的函数返回值可以根据逻辑自行设定,那么上述代码就表示一个Obj对象可以与另一个Obj对象相加,最终返回一个新的Obj对象。

        val obj1 = Obj()
        val obj2 = Obj()
        val obj3 = obj1 + obj2

 下面定义两个Money对象相加,首先定义Money类的结构,这里准备让Money的主构造函数接受一个value参数,用于表示钱的金额 创建Money.kt文件

class Money(val value: Int) {

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

}

可以看到,这里使用了operator关键字来修饰plus()函数,这是必不可少的。在plus()函数中,我们将当前的Money和对象value和参数传入的Money对象的value相加,然后得到的和传给一个新的Money对象并将该对象返回。这两个Money就可以相加了。

        val money1 = Money(5)
        val money2 = Money(10)
        val money3 = money2 + money1
        Log.d("TAG", "initData: $money3")

这样最终打印出来的结果就是 15。

如果Money对象直接和数字相加的话,就更好了。这个功能当然也是可以实现的。因为Kotlin允许我们对同一个运算符多重重载,代码如下:

class Money(val value: Int) {

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

}

这里又重载了一个plus()函数,接受的是一个整形数字,其他代码基本是一样的:

        val money1 = Money(5)
        val money2 = Money(10)
        val money3 = money2 + money1
        val monet4 = money3 + 20
        Log.d("TAG", "initData: $monet4")

Kotlin 允许我们重载的运算符和关键字众多,请执行查询

你可能感兴趣的:(Kotlin,kotlin,开发语言,android)