• Android开发基础——Kotlin:扩展函数和运算符重载


    扩展函数

    扩展函数表示即使在不修改某个类的源码的情况下,仍然可以打开该类,向该类添加新的函数。

    扩展函数的语法结构为:

    1. fun ClassName.methodName(param1:Int, param2:Int) {
    2. //TODO
    3. }

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

    比如虽然String类有内置的函数可以统计得到字符串的长度,但也可以通过该方法构建扩展函数进行统计:

    1. fun String.letterCount():Int {
    2. var count = 0
    3. for (char in this) {
    4. if (char.isLetter()) {
    5. count++
    6. }
    7. }
    8. return count
    9. }
    10. fun main() {
    11. println("Hello".letterCount())
    12. }

    比如上面的代码就构建了String类的扩展函数,以统计字符串中字符的个数。

    这就意味着虽然是对于String这样的final类,用户仍然可以通过扩展函数来实现一些客制化的功能。

    运算符重载

    运算符重载使用的是operator关键字,只要在指定函数的前面加上operator关键字,就可以实现运算符重载。这里的指定函数是和运算符对应的,比如加法运算符就是plus方法,减法运算符就是minus方法。

    1. class Money(val value:Int) {
    2. operator fun plus(money: Money):Money {
    3. val sum = value + money.value
    4. return Money(sum)
    5. }
    6. operator fun plus(newValue: Int):Money {
    7. val sum = value + newValue
    8. return Money(sum)
    9. }
    10. }
    11. fun main() {
    12. println(Money(2).plus(Money(3)).plus(5).value)
    13. println((Money(2) + Money(3) + 5).value)
    14. }

    比如上面的代码中,使用operator关键字修饰plus函数,然后在该运算符重载中进行value的相加,最后返回相加后的对象。同时还实现了运算符重载的多重重载,这里的使用逻辑大致和C++中的运算符重载类似。

    同时上述的函数调用形式可以使用正常的函数调用形式,也可以直接使用运算符的形式,两者的作用是等价的,不过后者是Kotlin的语法糖形式,看起来更为简便。

    而在Kotlin中,语法糖表达式和实际调用函数的对应关系为:

    语法糖表达式实际调用函数
    a + ba.plus(b)
    a - ba.minus(b)
    a * ba.times(b)
    a / ba.div(b)
    a % ba.rem(b)
    a++a.inc(b)
    a--a.dec(b)
    +aa.unaryPlus(b)
    -aa.unaryMinus(b)
    !aa.not(b)
    a == ba.equals(b)
    a > ba.compareTo(b)
    a < ba.compareTo(b)
    a >= ba.compareTo(b)
    a <= ba.compareTo(b)
    a..ba.rangeTo(b)
    a[b]a.get(b)
    a[b] = ca.set(b, c)
    a in bb.contains(a)

    只是最后的contains方法的调用关系和之前的函数是相反的。

  • 相关阅读:
    为什么香肠能激活手机屏幕,手套不能
    离子液体修饰高分子微球,小球集合型(FPC)poly(St-co-VEIB)微球和中空微球集合型(FHMC)poly(St-co-VEIB)微球
    uniapp 如何嵌套H5 页面?
    智慧园区的数字化建设和智能化管理
    测试工程师应具备何种心态?
    企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
    前端必备的25个CLI命令行
    阿里开源SpringBoot全栈小册 (建议学习)
    如何使用谷歌浏览器连接linux服务器SSH服务
    网络文件转换为转成MultipartFile
  • 原文地址:https://blog.csdn.net/SAKURASANN/article/details/127036463