27-二元运算符
4.7.2 二元运算符
二元运算符主要分为二元算数运算符、in操作符、索引访问操作符、调用操作符和比较操作符等。
1.二元算数运算符
表4-9所示是二元算数运算符与对应的转换方法。
| 表达式 | 对应转换方法 | 表达式 | 对应转换方法 | | :----- | :----- | :----- | :----- | :----- | :----- | | a + b | a.plus(b) | a / b | a.div(b) | | a - b | a.minus(b) | a%b | a.rem(b) | | a * b | a.times(b) | a..b | a.rangeTo(b) |
需要说明的是,从Kotlin 1.1版本开始,用于求余的mod操作符已被rem操作符替换。
data class Counter(val dayIndex: Int) {
operator fun plus(increment: Int): Counter {
return Counter(dayIndex + increment)
}
}
上面是一个给定起始值的Counter类示例,它可以使用重载的+运算符来实现累加操作。
2.in操作符
在前端JS中,in操作符用来判断某个属性是否属于某个对象,是对象的直接属性。表4-10所示是in操作符与对应的转换方法。
| 表达式 | 对应转换方法 | | :----- | :----- | :----- | :----- | | a in b | b.contains(a) | | a !in b | !b.contains(a) |
3.索引访问操作符
在Kotlin中,可以使用索引运算符来访问字符串中的某个字符,也可以使用for循环遍历字符串。表4-11所示是索引访问表达式与对应的转换方法。
| 表达式 | 对应转换方法 | 表达式 | 对应转换方法 | | :----- | :----- | :----- | :----- | :----- | :----- | | a[i] | a.get(i) | a[i]=b | a.set(i, b) | | a[i, j] | a.get(i, j) | a[i,j]=b | a.set(i, j, b) | | a[i_1, …, i_n] | a.get(i_1, … , i_n) | a[i_1, … , i_n]=b | a.set(i_1,… ,o_n,b) |
4.相等与不等运算符
在Kotlin中,== 操作符有些特殊,它被翻译成一个复杂的表达式,用于筛选空值。表4-12所示是相等与不等运算符对应的转换方法。
| 表达式 | 对应转换方法 | | :----- | :----- | :----- | :----- | | a == b | a?.equals(b) ?: (b === null) | | a != b | !(a?.equals(b) ?: (b === null)) |
需要注意的是,在Kotlin中,\== 和 !==操作符是不可以重载的。
5.比较操作符
所有的比较操作符都会转换为对compareTo函数的调用。该转换函数返回一个int类型的值,如表4-13所示。
| 表达式 | 对应转换方法 | 表达式 | 对应转换方法 | | :----- | :----- | :----- | :----- | :----- | :----- | | a > b | a.compareTo(b) > 0 | a >= b | a.compareTo(b) >= 0 | | a < b | a.compareTo(b) < 0 | a <= b | a.compareTo(b) <= 0 |
6.函数调用
在Kotlin中,方法调用也被定义为二元操作运算符,而这些方法往往可以转化为invoke函数,如表4-14所示。
| 方 法 | 对应转换方法 | | :----- | :----- | :----- | :----- | | a(i) | a.invoke(i) | | a(i, j) | a.invoke(i, j) | | a(i_1, …, i_n) | a.invoke(i_1, …, i_n) |