天天看点

第一行代码第三版笔记(第五章kotlin部分)

参考:https://blog.csdn.net/weixin_38244174/article/details/106002834

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

1、扩展函数

扩展函数是指在不改边某个类源码的情况下,依然可以打开这个类,并向该类提供新的函数。举例来讲:字符串包含字母、数字和特殊符号,统计字符串中字母的数量。

扩展函数的语法结构如下,相比于定义普通函数,我们只需要在前面加上一个ClassName.的语法结构,就可以将该函数添加到指定类中。

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

下面往String类中添加一个扩展函数,首先创建String.kt文件,将其定义成顶层方法一遍拥有全局访问域。

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

2、.有趣的运算符重载

运算符重载是Kotlin中一个有趣的语法。运算符包括±*/%等,Kotlin运算符重载允许任意两个对象相加或者更多其他操作。譬如两个Money对象相加。

运算符重载使用的是operator关键字,在指定函数前面使用operaor关键字,就可以实现运算符重载了。譬如加号运算符对应的是plus函数,减号对应的是minus函数。举例,完成两个Money对象的相加。

package com.company
 
//主构造函数接受一个value参数,用于表示钱的金额
class Money(val value: Int) {
    //使用operator关键来修饰plus函数是必不可少,将两个对象的value值相加,得到和后封装返回
    operator fun plus(money: Money): Money {
        val sum = value + money.value
        return Money(sum)
    }
   //仅仅单功能肯定不方便,Kotlin、允许我们对同一运算符进行多重重载,接受整型数字
    operator fun plus(newValue: Int): Money {
        val sum = value + newValue
        return Money(sum)
    }
}
           
package com.company
 
fun main() {
    val money1 = Money(5)
    val money2 = Money(10)
    val money3 = money1 + money2
    println(money3.value)
}
           
第一行代码第三版笔记(第五章kotlin部分)

举例来讲,我们在前面使用了一个随机生成字符串长度的函数,如果使用str*n岂不是很棒?

fun getRandomLengthString(str: String): String {
        val n = (1..20).random()
        var builder = StringBuilder()
        repeat(n) {
            builder.append(str)
        }
        return builder.toString()
    }
           

前面的扩展函数,扩展了String

//operator关键字必不可少,times对应*,定义扩展函数使用了String.。
operator fun String.times(n: Int): String {
    var builder = StringBuilder()
    repeat(n) {
        builder.append(this)
    }
    return builder.toString()
}
           
val str = "abc" * 10
println(str)
           

需要说明的是String类已经提供了将字符串重复n遍的repeat函数,因此可以进一步精简为:

最后重复任意次数的字符串代码如下: