Android开发(Kotlin) 扩展函数和运算符重载

目录

扩展函数

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

语法格式

kotlin 复制代码
fun ClassName.methodName(param1:Int,param2:Int):Int{

}

向String类中添加一个扩展函数,创建.kt文件,文件名没有特殊要求。定义成顶层方法。

kotlin 复制代码
fun String.lettersCount(): Int {

    var count = 0
    for (char in this) {

        if (char.isLetter()) {

            count++
        }
    }
    return count
}

lettersCount()方法定义成了String类的扩展函数,函数就有了String实例的上下文,因此lettersCount()函数就不再需要接收一个参数了,直接遍历this。

使用扩展函数

kotlin 复制代码
   "ASDGHJH1564564&*^&*%&^".lettersCount()

运行算符重载

运算符重载使用的是operator关键字。在指定函数前面加上operator。不同的运算符对应的重载函数不同。丽例如,加号运算符对应的是plus()函数,减号运算符对应的是minus()函数。

以加号运算符为例的语法结构

kotlin 复制代码
class obj{
	operator fun plus(obj:Obj):Obj{
	}
}

关键字operator 和plus是固定的。

让两个PowerConsumption对象相加。定义PowerConsumption类的结构,value代表用电量

kotlin 复制代码
class PowerConsumption(val value: Int) {
}

编写运算符重载

kotlin 复制代码
class PowerConsumption(val value: Int) {

    operator fun plus(powerConsumption: PowerConsumption): PowerConsumption {

        val sum = value + powerConsumption.value
        return PowerConsumption(sum)
    }
}

使用运算符

kotlin 复制代码
        val powerConsumption1 = PowerConsumption(50)
        val powerConsumption2 = PowerConsumption(100)

        val powerConsumption3 = powerConsumption1 + powerConsumption2
        println(powerConsumption3.value)

运算符重载有好多,对参考对照表使用

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

扩展函数及运算符重载的联合使用

下面是一个随机生成字符串长度的函数。

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

上面的代码功能是将传入str重复n次。是否能够使用str*n这种写法表示让str字符串重复n次,kotlin可以实现。

要让一个字符串乘以一个数字,肯定要在String类中重载乘号运算符,但string类是系统提供的类,就只能使用扩展函数了。

kotlin 复制代码
operator fun String.times(n: Int): String {

    val builder = StringBuilder()
    repeat(n) {
        builder.append(this)
    }
    return builder.toString()
}

使用String.times

kotlin 复制代码
        val str = "mnl"*3
        println(str)
kotlin 复制代码
mnlmnlmnl
相关推荐
阿巴斯甜9 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker9 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952710 小时前
Andorid Google 登录接入文档
android
黄林晴12 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android