扩展函数
扩展函数可以在不修改某个类源码的情况下,仍然可以打开这个类,向该类添加新的函数。
扩展函数的语法结构
fun ClassName.methodName(param1:Int,param2:Int) : Int{
return 0
}
假设需求:我们想统计字符串中字母的数量,如果采用java中的实现思想我们可能会这样写
object StringUtil{
fun lettersCount(str:String) : Int{
var count = 0
for (char in str){
if (char.isLetter()){
count++
}
}
return count
}
}
我们希望向String类中添加一个扩展函数,因此需要创建一个String.kt文件。文件名虽然并没有固定的要求,但是建议像哪个类中添加扩展函数,就定一个同名的kotlin文件,这样方便后续查找。扩展函数也是可以定义在任何一个现有类当中的,并不一定要创建新文件。不过通常来说,最好将它定义成顶层方法,这样可以让扩展函数拥有全局的访问域。
现在在String.kt下编写代码
fun String.lettersCount():Int{
var count = 0
for (char in this){
if (char.isLetter()){
count++
}
}
return count
}
现在lettersCount()方法定义成了String类的扩展函数,函数就自动拥有了String实例的上下文。因此lettersCount()函数就不用再接收一个字符串参数了,直接遍历this就可以了
定义好后可以这样使用
val count = "ABN1233xyz*(&".lettersCount()
最后顺便介绍两个kotlin自带的String类扩展函数
reverse()用于反转字符串
capitalize()用于对首字母进行大写
运算符重载
kotlin允许我们将所有的运算符甚至其他的关键字进行重载,从而拓展这些运算符和关键字的用法。
但在实际编程时要考虑合理性,比如两个Student对象相加没意义,但是两个Money有
运算符重载使用operator关键字,只要在指定函数的前面加上operator关键字就可以实现运算符重载功能了,但是指定函数是什么呢?不同运算符对应的重载函数也是不同的,比如加号运算符对应的是plus(),减号运算符对应的是minus()函数
需求:以加号运算符为例,实现让两个对象相加的功能。
class obj{
operator fun plus(obj: Objects):Objects{
//处理相加的逻辑
}
}
实现money相加,首先定义money类,并重载plus
class Money(val value :Int){
operator fun plus(money: Money):Money{
val sum = value + money.value
return Money(sum)
}
}
接下来就可以这样使用了,得到的结果为9
val money1 = Money(4)
val money2 = Money(5)
val money3 = money1 + money2
println(money3.value)
现在money对象已经可以和money对象相加了,如果我们希望能够更加方便,让money对象可以直接和对象相加呢?只需要进行多重重载即可
class Money(val value :Int){
operator fun plus(money: Money):Money{
val sum = value + money.value
return Money(sum)
}
operator fun plus(newValue : Int):Money{
val sum = value + newValue
return Money(sum)
}
}
这样就可以直接使用数字相加了,知道money4的值为19
val money1 = Money(4)
val money2 = Money(5)
val money3 = money1 + money2
println(money3.value)
val money4 = money3 + 10