位置:首页 > Kotlin > Android开发中Kotlin扩展函数与运算符重载实战指南

Android开发中Kotlin扩展函数与运算符重载实战指南

时间:2026-08-17  |  作者:星河游者  |  阅读:0

扩展函数

先来看扩展函数。

有时候,我们希望给某个类添加一个新方法,但又不方便直接修改它的源码。比如,这个类是系统自带的,或者我们拿不到它的修改权限。

这时,Kotlin 给出的答案就是扩展函数。 它可以在不改动类本身的前提下,给它“续”一个方法。

语法格式

语法格式很直观:

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

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

示例:给 String 添加统计字母个数的方法

举个例子,我们想给 String 类加一个统计字母个数的功能。

创建一个 .kt 文件,文件名随意。然后把它定义成顶层方法:

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

这里,lettersCount() 被声明成 String 类的扩展函数。

因此,在函数体内可以直接使用 this 来引用调用它的字符串实例,不再需要额外传参。

用起来也很简单:

   "ASDGHJH1564564&*^&*%&^".lettersCount()

运行算符重载

运算符重载也是 Kotlin 的一个实用特性。

它的核心是 operator 关键字。在对应函数前加上它,就能让自定义类型支持加减乘除等操作。

每种运算符都对应一个固定名称的函数。比如,加号对应 plus(),减号对应 minus()

基本语法

语法结构大致是这样:

class obj{
	operator fun plus(obj:Obj):Obj{
	}
}

关键字 operator 和函数名 plus 都是固定的,不能乱改。

示例:让两个用电量对象直接相加

假设我们有一个表示用电量的类 PowerConsumption

里面只有一个 value 属性,用来记录度数。

现在想让两个用电量对象能直接相加:

class PowerConsumption(val value: Int) {
}

重载加号运算符后,代码就变成了:

class PowerConsumption(val value: Int) {
    operator fun plus(powerConsumption: PowerConsumption): PowerConsumption {
        val sum = value + powerConsumption.value
        return PowerConsumption(sum)
    }
}

之后就能直接用 + 把两个用电量加起来:

        val powerConsumption1 = PowerConsumption(50)
        val powerConsumption2 = PowerConsumption(100)
        val powerConsumption3 = powerConsumption1 + powerConsumption2
        println(powerConsumption3.value)

常见运算符对应关系

其他运算符也类似。下面这张对照表可以帮你快速找到对应的函数:

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

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

光说不练假把式。

下面来看看,两者结合后能做出什么有意思的事。

原始函数写法

比如,有一个函数,用来生成随机长度的重复字符串:

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

这个函数的功能,是把传入的字符串重复 n 次。

目标:实现 str * 3 这样的写法

但你有没有想过,能不能直接用 str * 3 这样的写法,来表示“字符串重复 3 次”?

在 Kotlin 里完全可以实现。只需要给 String 类重载乘号运算符。

String 是系统类,改不了源码,怎么办?没错,用扩展函数来扩展它:

operator fun String.times(n: Int): String {
    val builder = StringBuilder()
    repeat(n) {
        builder.append(this)
    }
    return builder.toString()
}

调用效果

现在写起来就清爽多了:

        val str = "mnl"*3
        println(str)

输出:

mnlmnlmnl

扩展函数和运算符重载结合使用,可以明显提升代码的可读性和灵活性。

尤其是当你需要给第三方类或系统类“开挂”时,这套组合拳非常管用。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多