5.2有趣的运算符重载
运算符重载是Kotlin中一个很有趣的语法糖。java中有许多语言内置的运算符关键字,如+ - * / ++ --等,而Kotlin允许我们将所有的运算符甚至其它的关键字进行重载,从而扩展这些运算符和关键字的用法。
运算重载关键字是operator 加号运算符对应的是plus()减号运算符对应的是minus()。
class Obj{
operator fun plus(obj:Obj):Obj{
//处理相加的逻辑
}
}
val obj1 = Obj()
val obj2 = Obj()
val obj3 = obj1 + obj2
//注意加号感觉很神奇,其实它在编译的时候会被转换成obj1.plus(obj2)
现在让俩个money对象相加计算总和
class Money(valvalue:Int){
operator fun plus(money:Money):Money{
//处理相加的逻辑
val sum = value + money.value
return Money(sum)
}
}
val money1=Money(5)
val money2=Money(10)
val money3=money1+money2
分析:Money对象只允许和另一个Money对象相加,这样很不方便,如果Money能够直接和数字相加,就更好了。Kotlin允许我们对同一运算符进行多重重载。
class Money(valvalue:Int){
…..
operator fun plus(newValue:Int):Money{
//处理相加的逻辑
val sum=value+newValue
return Money(sum)
}
}
val money4=money3+20
语法糖表达式和实际调用函数对照表
语法糖表达式 | 实际调用函数 |
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() |
+a | a.unaryPlus() |
-a | a.inaryMinus() |
!a | a.not() |
a==b | a.euqals(b) |
a>b |
|
a<b |
|
a>=b | a.compareTo(b) |
a<=b |
|
a..b | a.rangeTo(b) |
a[b] | a.get(b) |
a[b]=c | a.set(b,c) |
a in b | b.contains(a) |
注意:最后一个反过来了 不再是A对B 而是B包含A
举一个让String字符串重复若干次的例子:
operator fun String.times(n:Int):String{ //我对String类添加扩展函数,重载*。 函数功能就是字符串重复n次
val builder=StringBuilder()
repeat(n){
builder.append(this)
}
return builder.toString()
}
val str="abc"*3
是不是很简单?是不是很有意思?
我只是简单试验以下,其实Kotlin的String已经提供了一个用于将字符串重复n次的repeat()函数,所以times()函数可以进一步写成:
operator fun String.times(n:Int) = repeat(n)