運(yùn)算符和表達(dá)式
Kotlin基本支持Java的全部運(yùn)算符(可能有些種子語(yǔ)法上存在差異)境输,Kotlin不支持三目運(yùn)算符梨撞。
1. 與Java相同的運(yùn)算符
Kotlin的運(yùn)算符都是以方法形式實(shí)現(xiàn)的,這些運(yùn)算符都具有特定的符號(hào)和固定的優(yōu)先級(jí)挤渔。
-
單目前綴運(yùn)算符
運(yùn)算符 對(duì)應(yīng)的方法 +a a.unaryPlus() -a a.unaryMinus() !a a.not fun main(args: Array<String>) { val a = 20 val b = -a val c = a.unaryMinus() println("b: $b, c: $c") // b: -20, c: -20 val flag = true val f1 = !flag val f2 = flag.not() println("f1: $f1, f2: $f2") // f1: false, f2: false }
如果在API中發(fā)現(xiàn)某個(gè)類有
unaryPlus()
窗市、unaryMinus()
先慷、not()
方法,那就說(shuō)明可對(duì)該類的實(shí)例使用單目前綴運(yùn)算符+
咨察、-
论熙、!
進(jìn)行運(yùn)算。 -
自加和自減運(yùn)算符
運(yùn)算符 對(duì)應(yīng)的方法 a++ a.inc() a-- a.dec() 如果在API中發(fā)現(xiàn)某個(gè)類有
inc()
摄狱、dec()
方法脓诡,那就說(shuō)明可對(duì)該類的實(shí)例使用++
、--
進(jìn)行運(yùn)算媒役。 -
雙目算術(shù)運(yùn)算符
運(yùn)算符 對(duì)應(yīng)的方法 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) 如果在API中發(fā)現(xiàn)某個(gè)類有一個(gè)帶參數(shù)的
plus()
祝谚、minus()
、times()
酣衷、div()
踊跟、rem()
、rangeTo()
方法鸥诽,那就說(shuō)明可對(duì)該類的實(shí)例使用以上雙目算術(shù)運(yùn)算符商玫。 -
in和!in運(yùn)算符
運(yùn)算符 對(duì)應(yīng)的方法 a in b b.contains(a) a !in b !b.contains(a) fun main(args: Array<String>) { val str = "JamFF" println(str.contains("java")) println("java" in str) val arr = arrayOf(8, 32, 94, 53, 10) println(arr.contains(53)) println(53 in arr) }
如果在API中發(fā)現(xiàn)某個(gè)類有一個(gè)帶參數(shù)
contains()
方法,那就說(shuō)明可對(duì)該類的實(shí)例使用in
牡借、!in
運(yùn)算符拳昌。 -
索引訪問(wèn)運(yùn)算符
運(yùn)算符 對(duì)應(yīng)的方法 a[i] a.get(i) a[i, j] a.get(i, j) a[i_l, ..., i_n] a.get(i_l, ..., i_n) a[i]=b a.set(i ,b) a[i, j]=b a.set(i, j, b) a[i_l,...,i_n]=b a.set(i_l ,..., i_n) -
調(diào)用運(yùn)算符
運(yùn)算符 對(duì)應(yīng)的方法 a() a.invoke() a(b) a.invoke(b) a(b1, b2) a.invoke(b1, b2) a(b1, b2, b3, ...) a.invoke(b1, b2, b3, ...) fun main(args: Array<String>) { val s = "java.lang.String" val mtd = Class.forName(s).getMethod("length") // 使用傳統(tǒng)方法,使用Method對(duì)象的invoke方法 println(mtd.invoke("java")) // 輸出4 // 使用調(diào)用運(yùn)算符 println(mtd("java")) // 輸出4 }
-
廣義賦值運(yùn)算符
運(yùn)算符 對(duì)應(yīng)的方法 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) -
相等于不等運(yùn)算符
運(yùn)算符 對(duì)應(yīng)的方法 a == b a?.equals(b):(b===null) a != b !(a?.equals(b)?:(b===null)) Kotlin中
==
和equals
本質(zhì)是一樣的钠龙,只不過(guò)==
避免了空指針炬藤;而Java中比較對(duì)象的==
和!=
在Kotlin中由===
和!==
代替。 -
比較運(yùn)算符
運(yùn)算符 對(duì)應(yīng)的方法 a > b a.compareTo(b) > 0 a < b a.compareTo(b) < 0 a >= b a.compareTo(b) >= 0 a <= b a.compareTo(b) <= 0 如果在API中發(fā)現(xiàn)某個(gè)類實(shí)現(xiàn)了
Comparable
方法碴里,那就該類的實(shí)例即可使用比較運(yùn)算符來(lái)比較大小沈矿。
2. 位運(yùn)算符
Kotlin支持的位運(yùn)算符同樣有7個(gè),但是并不是特殊字符形式咬腋,而是以infix
函數(shù)的形式給出的羹膳,因此只能用函數(shù)名執(zhí)行這些位運(yùn)算符。
-
and(bits)
:按位與根竿。 -
or(bits)
:按位或陵像。 -
inv(bits)
:按位非。 -
xor(bits)
:按位異或寇壳。 -
shl(bits)
:左移運(yùn)算符醒颖。 -
shr(bits)
:右移運(yùn)算符。 -
ushr(bits)
:無(wú)符號(hào)右移運(yùn)算符壳炎。
Kotlin的位運(yùn)算符只能對(duì)Int
和Long
兩種數(shù)據(jù)類型起作用泞歉。
3. 區(qū)間運(yùn)算符
-
閉區(qū)間運(yùn)算符
a..b
定義一個(gè)從a到b(包含a和b)的所有值的區(qū)間。fun main(args: Array<String>) { val range = 2..6 for (num in range) { print("$num ") // 輸出2 3 4 5 6 } }
-
半開(kāi)區(qū)間運(yùn)算符
a until b
定義一個(gè)從a到b(包含a,不包含b)的所有值的區(qū)間腰耙。
利用半開(kāi)區(qū)間便利數(shù)組的列表時(shí)非常方便偿洁。fun main(args: Array<String>) { val books = arrayOf("Swift", "Kotlin", "C", "C++") for (index in 0 until books.size) { println("第${index + 1}中語(yǔ)言是:${books[index]}") } }
-
反向區(qū)間
如果希望區(qū)間從大到小,可以使用downTo
運(yùn)算符(其實(shí)是一個(gè)infix
函數(shù))沟优,該運(yùn)算符同樣是一個(gè)閉區(qū)間涕滋。fun main(args: Array<String>) { val range = 6 downTo 2 for (num in range) { print("$num ") // 輸出6 5 4 3 2 } }
-
區(qū)間步長(zhǎng)
前面區(qū)間的默認(rèn)步長(zhǎng)都是1,可通過(guò)step
運(yùn)算符(其實(shí)是一個(gè)infix
函數(shù))指定區(qū)間步長(zhǎng)挠阁。fun main(args: Array<String>) { for (num in 7 downTo 1 step 2) { print("$num ") // 輸出7 5 3 1 } }
4. 運(yùn)算符重載
重載運(yùn)算符的方法需要運(yùn)用operator
修飾符進(jìn)行標(biāo)記宾肺。
-
重載單目前綴運(yùn)算符
data class Data(val x: Int, val y: Int) { // 為Data類定義一個(gè)unaryMinus()方法 operator fun unaryMinus(): Data { return Data(-x, -y) } } // 以擴(kuò)展方法的形式為Data類定義unaryPlus()方法 operator fun Data.unaryPlus(): Data { return Data(-x, -y) } fun main(args: Array<String>) { val d = Data(4, 10) println(-d) println(+d) }
-
重載自加和自減運(yùn)算符
data class Data(val x: Int, val y: Int) { // 為Data類定義一個(gè)inc()方法 operator fun inc(): Data { return Data(x + 1, y + 1) } } // 以擴(kuò)展方法的形式為Data類定義dec()方法 operator fun Data.dec(): Data { return Data(x - 1, y - 1) } fun main(args: Array<String>) { var d = Data(4, 10) println(d++) // 輸出Data(x=4, y=10) println(d) // 輸出Data(x=5, y=11) var dd = Data(9, 20) println(--dd) // 輸出Data(x=8, y=19) println(dd) // 輸出Data(x=8, y=19) }
-
重載雙目算術(shù)運(yùn)算符
data class Point(val x: Int, val y: Int) { // 為Point類定義一個(gè)minus()方法 operator fun minus(target: Point): Double { return Math.hypot((this.x - target.x).toDouble() , (this.y - target.y).toDouble()) } } // 以擴(kuò)展方法的形式為Point類定義dec()方法 operator fun Point.times(target: Point): Int { return Math.abs(this.x - target.x) * Math.abs(this.y - target.y) } fun main(args: Array<String>) { val p1 = Point(0, 0) val p2 = Point(3, 4) println("p1與p2的距離為:${p1 - p2}") // 輸出5 println("p1與p2圍成的矩形面積為:${p1 * p2}") // 輸出12 }
重點(diǎn)
-
in
和!in
運(yùn)算符 -
==
和===
運(yùn)算符 - 位運(yùn)算符
- 區(qū)間運(yùn)算符
- 運(yùn)算符重載