5.6 扩展函数和运算符重载

本文介绍了Kotlin中的扩展函数和运算符重载特性。通过示例展示了如何为String类添加字母计数的扩展函数,以及如何实现Money类的加法运算符重载。同时,提到了合理使用运算符重载的原则,并提供了相关语法糖表达式与实际函数调用的对照表。
摘要由CSDN通过智能技术生成

扩展函数

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

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

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

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值