一、操作符重载
Kotlin有一些固定数量象征性的操作符,可以在任何类中使用它们。方法就是创建一个方法,方法名为保留的操作符关键字,这样就可以让操作符的行为映射到此方法上。
重载操作符可以增加代码可读性和简洁性。
1.1什么是操作符重载?
例如,同样是一个+号,在两个数字之间表示加法,在两个字符串之间则表示将它们连接成一个新字符串;对于Kotlin来说,所有重载了运算符的函数都要用operator关键字标记。
所有的Kotlin操作符都是通过特定名称的函数重载实现的。
二、Kotlin与Java相同的运算符
操作符 | 重载函数 | 描述 |
---|---|---|
a++/++a | a.inc() | 自增 |
a--/--a | a.dec() | 自减 |
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+=b | a.plusAssign(b) | a=a+b |
a-=b | a.minusAssign(b) | a=a-b |
a*=b | a.timesAssign(b) | a=a*b |
a/=b | a.divAssign(b) | a=a/b |
a%=b | a.remAssign(b) | a=a%b |
!a | a.not() | 返回a的逻辑非值 |
a>b | a.compareTo(b)>0 | 大于 |
a<b | a.compareTo(b)<0 | 小于 |
a>=b | a.compareTo(b)>=0 | 大于等于 |
a<=b | a.compareTo(b)<=0 | 小于等于 |
a([参数列表]) | a.invoke([参数列表]) | 调用特定参数列表的函数 |
三、Kotlin与Java使用有差异的运算符
主要存在如下两个:
==和!=
| 操作符 | 函数 |
| :-------- | --------:|
| a==b | a?.equals(b)?:b===null |
| a!=b | !(a?.equals(b)?:b===null) |
a?.equals(b)?:b===null用Java写出来如下:
if(a != null){ return a.equals(b); }else{ return b == null; }
Kotlin调用的是equals方法来比较两个元素是否对象相等,而不是Java中的比较引用相同。
如果要比较两个对象的引用是否相同,可以使用===和!==操作符,这两个操作符和Java中的==和!=是不一样的。
2.[]
| 操作符 | 函数 |
| :-------- | --------:|
| a[i] | a.get(i) |
| a[i,j] | a.get(i,j)|
| a[i_1,...,i_n] | a.get(i_1,...,i_n) |
| a[i]=b | a.set(i,b) |
| a[i,j]=b | a.set(i,j,b)|
| a[i_1,...,i_n]=b | a.set(i_1,...,i_n,b) |
与Java不同,Kotlin的这个运算符不仅可以用在数组变量后,也可以用在集合变量后,可以方便地调用和操作数组和集合中的元素。
四、Java中有而Kotlin中没有的运算符
Kotlin中抛弃了类C风格的位运算符,只是定义了几个函数:
Java位运算符 | Kotlin中缀 | Kotlin函数 | 描述 | |
---|---|---|---|---|
~a | 无 | a.inv() | 按位取非 | |
a&b | a and b | a.and(b) | 按位与 | |
a | b | a or b | a.or(b) | 按位与 |
a^b | a xor b | a.xor(b) | 按位异或 | |
a<<b | a shl b | a.shl(b) | 左移b位 | |
a>>b | a shr b | a.shr(b) | 右移b位 | |
a>>>b | a ushr b | a.ushr(b) | 无符号右移b位 |
对于<<=、>>=、>>>=这三个赋值操作符,Kotlin中没有与之对应的函数。
中缀表示法是Kotlin定义的一种特殊的函数调用方式,标记为infix,并且只有一个参数的扩展函数或成员函数,可以使用这种表示方法。
五、Java中没有而Kotlin中有的运算符
is和!is
用于检查对象是否是某个类的实例,相当于Java中的instanceof运算符。
in和!in
a in b重载为b.contains(a),用于检查a是否是b内的元素,b可以是数组、集合和区间。
-此运算符可以用在for循环中,用来遍历b中的元素:
val b = arrayOf(1, 2, 3)for(a in b) println(a)
..
a..b重载为a.rangeTo(b),返回一个从a到b的区间,a和b也包含在区间内(闭区间)。要求a和b都是整数,并且a<=b。