一元操作符
Kotlin中一元操作符分为 一元前缀操作符 和 递增与递减操作符
一元前缀操作符
这些操作符以及所有其他操作符都针对基本类型做了优化,不会为它们引入函数的调用:
- +a ==> a.unaryPlus()
- -a ==> a.unaryMinus()
- !a ==> a.not()
递增递减运算符
inc() 和 dec() 函数返回一个值,它用于赋值给使用++ 或 – 操作的变量。
- a++ ==> a=a.inc()
- a-- ==> a=a.dec()
计算表达式的步骤是:
- 把 a 的初始值存储到临时空间a0
- 把 a.inc() 结果赋值给 a
- 把 a0作为表达式的结果返回
二元运算符
在Kotlin中所有算数运算符的本质,均是调用了它们对应的函数
算数运算符
- 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.mod(b) (已弃用)
- a … b ==> a.rangeTo(b)
注意:%运算 ,自 Kotlin 1.1 起支持 rem 运算符。Kotlin 1.0 使用 mod 运算符,mod 运算符在Kotlin 1.1 中被弃用。
data class Counter(val dayIndex: Int) {
operator fun plus(increment: Int): Counter {
return Counter(dayIndex + increment)
}
}
" in "操作符
- a in b ==> b.contains(a)
- a !in b ==> b.contains(a)
b.contains(a)函数: 用来判断在b中是否包含a,返回值为布尔类型
数组操作符
方括号转换为调用带有适当数量参数的 get 和 set 函数。
表达式 | 含义 |
---|---|
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) |
调用操作符
圆括号则转换为调用带有适当数量参数的 invoke函数。
表达式 | 含义 |
---|---|
a() | a.invoke() |
a(i) | a.invoke(i) |
a(i, j) | a.invoke(i, j) |
a(i_1, ……, i_n) | a.invoke(i_1, ……, i_n) |
复合操作符
对于复合赋值操作,先进性逻辑运算,再进行赋值
表达式 | 含义 |
---|---|
a += b | a.plusAssign(b) |
a -= b | a.minusAssign(b) |
a *= b | a.timesAssign(b) |
a /= b | a.divAssign(b) |
a %= b | a.remAssign(b) |
注意:赋值在 Kotlin 中不是表达式。
相等与不等操作符
这些操作符只使用函数 equals(other: Any?): Boolean,可以覆盖它来提供自定义的相等性检测实现。不会调用任何其他同名函数(如 equals(other: Foo))。
表达式 | 含义 |
---|---|
a == b | a?.equals(b) ?: (b === null) |
a != b | !(a?.equals(b) ?: ) |
注意:=== 和 !==(同一性检查)不可重载,因此不存在对他们的约定。
这个 == 操作符有些特殊:它被翻译成一个复杂的表达式,用于筛选 null 值。
null == null 总是 true,
对于非空的 x,x == null 总是 false 而不会调用 x.equals()。.
比较操作符
所有的比较都转换为对 compareTo 的调用,这个函数需要返回 Int 值
表达式 | 含义 |
---|---|
a > b | a.compareTo(b) > 0 |
a < b | a.compareTo(b) < 0 |
a >= b | a.compareTo(b) >= 0 |
a <= b | a.compareTo(b) <= 0 |