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

扩展函数

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

2、语法结构:

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

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

3、例子:一段字符串中可能包含字母、数字和特殊符号等字符,实现统计字符串中字母的数量。

        一般的写法:

// 单例类
object StringUtil{

    fun lettersCount(str: String): Int{
        var count = 0
        for(char in str){
            if(char.isLetter()) count++
        }
    	return count
    }
}
val str = "ABC123xyz!@#"
val count = StringUtil.lettersCount(str)

        有了扩展函数之后可以将 lettersCount( ) 函数添加到 String 类中,先创建一个 String.kt 文件,添加下列代码,将 lettersCount( ) 方法定义成 String 类的扩展函数,那么函数中就自动拥有了 String 实例的上下文。因此 lettersCount( ) 函数就不再需要接收一个字符串参数了,而是直接遍历 this 即可,因为现在 this 就代表这字符串本身。

fun String.lettersCount(): Int{
    var count = 0
    for(char in this){
        if(char.isLetter()){
            count++
        }
    }
    return count
}
val count = "ABC123xyz!@#".lettersCount()

        String 是一个 final 类,任何一个类都不可以继承它。但在 Kotlin 中,可以向 String 类中扩展任何函数,使它的 API 变得丰富。比如,Kotlin 中的 String 还有 reverse( ) 函数用于反转字符串, capitalize( ) 函数用于对首字母进行大写等等。

运算符重载

        Kotlin 允许将所有的运算符甚至其他关键字进行重载,从而拓展这些运算符和关键字的用法。Kotlin的运算符重载允许我们让任意两个对象进行运算。运算符重载的关键字是 operator,只要在指定函数前面加上 operator 关键字,就可以实现运算符重载的功能。

        不同运算符对应的重载函数也是不同的,比如加号运算符对应的是 plus( ) 函数,减号运算符对应的是 minus( ) 函数。

 例1:两个Money对象相加,Money对象直接和数字相加。

让 Money 主构造函数接收一个value参数,用于表示钱的金额,创建Money.kt。

class Money(val value: Int)
class Money(val value: Int){

    // 使用运算符重载实现两个Money对象相加

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

    // Kotlin允许对同一个运算符进行多重重载,可以实现Money对象直接和数字相加

    operator fun plus(newValue: Int):Money{
        val sum = value + newValue
        return Money(sum)
    }
}
val money1 = Money(5)
val money2 = Money(10)
val money3 = Money1 + Money2
println(money3.value)
val money4 = money3 + 20
println(money4.value)

例2:随机生成字符串长度的函数。

        一般的写法:

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

        这个函数的核心思想就是将传入的字符串重复n次,在Kotlin中可以使用 str * n 这种写法来表示让str 字符串重复n次。借助扩展函数功能向String 类中添加新函数。打开String.kt文件,然后加入如下代码:

operator fun String.times(n:Int):String{
    val builder = StringBuilder()
    repeat(n){
        builder.append(this)
    }
    return builder.toString()
}
val str = "abc" * 3
println(str)

        其实Kotlin 的 String类中已经提供了一个用于将字符串重复n遍的repeat( )函数,一次times( )函数还可以进一步精简。

operator fun String.times(n: Int) = repeat(n)

        所以最终的实现代码:

fun getRandomLengthString(str: String) = str * (1..20).random()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值