Kotlin:扩展函数和运算符重载
1 扩展函数
扩展函数表示即使在不修改某个类的源码的情况下,仍然可以打开这个类,向该类添加新的函数。
比如,一段字符串中可能包含字母、数字和特殊符号等字符,现在希望统计字符串中字母的数量,要怎么实现这个功能呢?如果按照一般
的编程思维:
object StringUtil {
fun lettersCount(str: String): Int {
var count = 0
for (char in str) {
if (char.isLetter()) {
count++
}
}
return count
}
}
这里先定义了一个StringUtil
单例类,然后在这个单例类中定义了一个lettersCount()
函 数,该函数接收一个字符串参数。在lettersCount()
方法中,使用for-in
循环去遍历字符串中的每一个字符。如果该字符是一个字母的话,那么就将计数器加1
,最终返回计数器的值。
当需要统计某个字符串中的字母数量时,只需要编写如下代码即可:
val str = "ABC123xyz!@#"
val count = StringUtil.lettersCount(str)
这种写法绝对可以正常工作,并且这也是Java
编程中最标准的实现思维。但是有了扩展函数之后就不一样了,可以使用一种更加面向对象的思维来实现这个功能,比如说将lettersCount()
函数添加到String
类当中。
下面是扩展函数的语法结构,如下所示:
fun ClassName.methodName(param1: Int, param2: Int): Int {
return 0
}
相比于定义一个普通的函数,定义扩展函数只需要在函数名的前面加上一个ClassName.
的语法结构,就表示将该函数添加到指定类当中了。
了解了定义扩展函数的语法结构,接下来就使用扩展函数的方式来优化刚才的统计功能。
由于我们希望向String
类中添加一个扩展函数,因此需要先创建一个String.kt
文件。文件名虽然并没有固定的要求,但是建议向哪个类中添加扩展函数,就定义一个同名的Kotlin
文件,这样便于以后查找。当然,扩展函数也是可以定义在任何一个现有类当中的,并不一定非要创建新文件。不过通常来说,最好将它定义成顶层方法,这样可以让扩展函数拥有全局的访问域。
在String.kt
文件中编写如下代码:
fun String.letterCount(): Int {
var count = 0
for (char in this