Kotlin——运算符和表达式
与Java相同的运算符
Kotlin完全支持Java的运算符
- Kotlin不支持Java的三目运算符——Kotlin使用if表达式代替了三目运算符
- Kotlin的位运算符与Java的位运算符也略有区别
Kotlin的运算符都是以方法形式来实现的,这些运算符都具有特定的符号和固定的优先级,各种运算符对应的方法名都是固定的,我们只要为某类型提供了特定名称的方法,成员方法或扩展方法。接下来即可对该类型的对象使用“+”进行运算,因此,Kotlin的所有运算符的功能都是广义的,不仅能作用于数值型、字符串,也可以作用于任意自定义的Kotlin类
单目前缀运算符
单目前缀运算符有:+(一元加)、-(一元减)、!(非)
- 对应的方法
运算符 | 对应的方法 |
---|---|
+a | a.unaryPlus() |
-a | a.unaryMinus() |
!a | a.not() |
var a : Int = 20;
//使用运算符
val b = -a
//调用运算符方法
val c = a.unaryPlus();
println("b的值${b}c的值${c}")
val flag = true
val notFlag = !flag
println("flag !${notFlag}")
自加和自减运算符
运算符 | 对应的方法 |
---|---|
a++ | a.inc() |
a-- | a.dec() |
- ++、--放置在不同位置对运算的影响
当++、--放在变量前面时,执行过程:
- 先对变量调用inc()、dec()方法,并将方法返回值赋给变量
- 自加或自减表达式返回变量的新值
当++、--放在变量后面是,执行过程:
- 先用一个临时变量缓存变量的值
- 对变量调用inc()、dec()方法,并将方法返回值赋给变量
- 自加或自减表达式返回临时变量的值
var a = 20;
a++
print(a); //21
//调用方法
a = a.inc() //22
print(a)
双目运算符
运算符 | 对应的方法 |
---|---|
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.rangeTo(b) |
var a = 5
var b = 6
//+
println(a+b)
println(a.plus(b))
//-
println(a-b)
println(a.minus(b))
//*
println(a*b)
println(a.times(b))
///
println(a/b)
println(a.div(b))
//%
println(a%b)
println(a.rem(b))
//..
println(a..b)
println(a.rangeTo(b))
in和!in运算符
a in b 判断b中是否包含a
运算符 | 对应的方法 |
---|---|
a in b | b.contains(a) |
a !in b | !b.minus(s) |
var s = "hello world"
var si = "hello"
println(si in s)
println(s.contains(si))
索引访问运算符
运算符 | 对应的方法 |
---|---|
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) |
var s = "testIndexOperation"
//get
println(s.get(3))
println(s[3])
//java List
var list = ArrayList<String>()
list.add("add1")
list.add("add2")
list.add("add3")
list.add("add4")
//使用索引运算符
println(list[3])
//使用get函数
println(list.get(3))
调用运算符
运算符 | 对应方法 |
---|---|
a() | a.invoke() |
a(b) | a.invoke(b) |
a(b1,b2) | a.invoke(b1,b2) |
a(b1,b2,b3...) | a.invoke(b1,b2,b3,...) |
广义赋值运算符
运算符 | 对应的方法 |
---|---|
a+=b | a.plusAssign(b) |
a-=b | a.minusAssign(b) |
a*=b | a.timeAssign(b) |
a/=b | a.divAssign(b) |
a%=b | a.remAssign(b) |
对于广义赋值操作,例如 a+=b,编译器会先判断plusAssign()方法是否存在,如果存在则按照如下步骤执行
- 如果plus()方法也存在,则会报错
- 确保plusAssign()没有返回值
- 如果满足 1、2两步的检查,那么转换为执行a.plusAssign(b),如果plusAssign()方法不存在,那么a+=b 将转换为 a=a+b
相等于不相等运算符
运算符 | 对应的方法 |
---|---|
a==b | a?.equals(b)?:(b===null) |
a!=b | !(a?.equals(b)?:(b===null)) |
Kotlin的“==”不再比较两个变量是否引用同一个对象,实际上“==”与equals()比较基本是等义的,只不过==比较是空指针安全的
而在Kotlin中 判断两个变量是否指向同一个对象 要使用 ===
比较运算符
运算符 | 对应的方法 |
---|---|
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..b用于顶一个一个从a~b(包括a、b边界值)的所有值的区间,对于闭区间运算符而言 a不能大于b
半开区间运算符
半开区间运算符 a until b 用于定义一个从a~b(包括a边界,不包括b)的所有值的区间。同样也是a不能大于b
反向区间
如果希望区间可以从大到小,则可以使用downTo运算符,该运算符同样构建一个闭区间。此时要求b不能大于a
区间步长
我们可以通过step运算符,可以显式指定区间的步长
for (num in 7 downTo 1 step 2){
println("${num}")
}
运算符装载
Kotlin的运算符都是靠特定名称的方法支撑的,因此只要重载这些名称的方法,我们就可以为任意类添加运算符
重载运算符的方法需要使用operator修饰符进行标记
重在单目前缀运算符
只要为任意类定义名为unaryPlus()、unaryMinus()、not() 且以operator修饰的方法,程序即可对该类的实例使用+、-、!单目前缀运算符