Kotlin快速入門(二)——運算子和表示式
運算子和表示式
Kotlin基本支援Java的全部運算子(可能有些種子語法上存在差異),Kotlin不支援三目運算子。
1. 與Java相同的運算子
Kotlin的運算子都是以方法形式實現的,這些運算子都具有特定的符號和固定的優先順序。
-
單目字首運算子
運算子 對應的方法 +a a.unaryPlus() -a a.unaryMinus() !a a.not fun main(args: Array<String>) { val a = 20 val b = -a println(b) val c = a.unaryMinus() println("b: $a, 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中發現某個類有
unaryPlus()
、unaryMinus()
、not()
方法,那就說明可對該類的例項使用單目字首運算子+
、-
、!
進行運算。 -
自加和自減運算子
運算子 對應的方法 a++ a.inc() -a a.dec() 如果在API中發現某個類有
inc()
、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.rangeTo(b) 如果在API中發現某個類有一個帶引數的
plus()
、minus()
、times()
、div()
、rem()
、rangeTo()
方法,那就說明可對該類的例項使用以上雙目算術運算子。 -
in和!in運算子
運算子 對應的方法 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中發現某個類有一個帶引數
contains()
方法,那就說明可對該類的例項使用in
、!in
運算子。 -
索引訪問運算子
運算子 對應的方法 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) -
呼叫運算子
運算子 對應的方法 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") // 使用傳統方法,使用Method物件的invoke方法 println(mtd.invoke("java")) // 輸出4 // 使用呼叫運算子 println(mtd("java")) // 輸出4 }
-
廣義賦值運算子
運算子 對應的方法 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) -
相等於不等運算子
運算子 對應的方法 a == b a?.equals(b):(b===null) a != b !(a?.equals(b)?:(b===null)) Kotlin中
==
和equals
本質是一樣的,只不過==
避免了空指標;而Java中比較物件的==
和!=
在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 如果在API中發現某個類實現了
Comparable
方法,那就該類的例項即可使用比較運算子來比較大小。
2. 位運算子
Kotlin支援的位運算子同樣有7個,但是並不是特殊字元形式,而是以infix
函式的形式給出的,因此只能用函式名執行這些位運算子。
- and(bits):按位與。
- or(bits):按位或。
- inv(bits):按位非。
- xor(bits):按位異或。
- shl(bits):左移運算子。
- shr(bits):右移運算子。
- ushr(bits):無符號右移運算子。
Kotlin的位運算子只能對Int
和Long
兩種資料型別起作用。
3. 區間運算子
-
閉區間運算子
a..b
定義一個從a到b(包含a和b)的所有值的區間。fun main(args: Array<String>) { val range = 2..6 for (num in range) { print("$num ") // 輸出2 3 4 5 6 } }
-
半開區間運算子
a until b
定義一個從a到b(包含a,不包含b)的所有值的區間。利用半開區間便利陣列的列表時非常方便。
fun main(args: Array<String>) { val books = arrayOf("Swift", "Kotlin", "C", "C++") for (index in 0 until books.size) { println("第${index + 1}中語言是:${books[index]}") } }
-
反向區間
如果希望區間從大到小,可以使用
downTo
運算子(其實是一個infix函式),該運算子同樣是一個閉區間。fun main(args: Array<String>) { val range = 6 downTo 2 for (num in range) { print("$num ") // 輸出6 5 4 3 2 } }
-
區間步長
前面區間的預設步長都是1,可通過
step
運算子(其實是一個infix函式)指定區間步長。fun main(args: Array<String>) { for (num in 7 downTo 1 step 2) { print("$num ") // 輸出7 5 3 1 } }
4. 運算子過載
過載運算子的方法需要運用operator修飾符進行標記。
-
過載單目字首運算子
data class Data(val x: Int, val y: Int) { // 為Data類定義一個unaryMinus()方法 operator fun unaryMinus(): Data { return Data(-x, -y) } } // 以擴充套件方法的形式為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) }
-
過載自加和自減運算子
data class Data(val x: Int, val y: Int) { // 為Data類定義一個inc()方法 operator fun inc(): Data { return Data(x + 1, y + 1) } } // 以擴充套件方法的形式為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) }
-
過載雙目算術運算子
data class Point(val x: Int, val y: Int) { // 為Point類定義一個minus()方法 operator fun minus(target: Point): Double { return Math.hypot((this.x - target.x).toDouble() , (this.y - target.y).toDouble()) } } // 以擴充套件方法的形式為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 }
重點
-
in
和!in
運算子 -
==
和===
運算子 - 位運算子
- 區間運算子
- 運算子過載