3.1.4 in和!in運算符
in和!in對應的固定方法名字依次如表3.4所示。
表3.4 in和!in運算符
運算符 對應的方法
a in b b.contains(a)
a !in b !b.minus(a)
例如以下程序:
程序清單:codes\03\3.1\InTest.kt
fun main(args: Array<String>) {
var str = "fkjava.org"
// 調用String的contains方法判斷
println( str.contains("java") )
// 使用in運算符判斷
println("java" in str)
val array = arrayOf(24, 45, 100, -3, 30)
// 調用Array的contains方法判斷
println(array.contains(100)) // 輸出true
// 使用in運算符判斷
println(100 in array) // 輸出true
}
上面代碼能夠看出,因爲String類中存在帶一個參數的contains()方法,在Kotlin中便可使用in運算符進行計算。因而可知,之後讀者在查閱API時發現某個類有帶一個參數的contains()方法,那就說明可對該類的實例使用in、!in運算符。
提示:這就是Kotlin比Java簡潔的地方,Java程序要判斷某個String是否包含某個子串,只能調用contains()方法進行判斷,但Kotlin則只要使用in運算符便可搞定。Kotlin提供了大量這種「語法糖」來讓開發者能享受編程。
3.1.5 索引訪問運算符
索引訪問運算符對應的固定方法名依次如表3.5所示。
表3.5 索引訪問運算符
運算符 對應的方法
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)
例如以下程序:
程序清單:codes\03\3.1\IndexTest.kt
fun main(args: Array<String>) {
var str = "fkjava.org"
// 根據get方法獲取指定索引的字符
println(str.get(2))
// 使用索引運算符來獲取指定索引的字符
println(str[2])
// 建立Java的ArrayList集合
var list = java.util.ArrayList<String>()
list.add("Java")
list.add("Kotlin")
list.add("Go")
// 使用索引運算符來獲取指定索引的List集合元素
println(list[1]) // 輸出Kotlin
// 使用索引運算符來修改指定索引的List集合元素
list[2] = "Swift"
println(list)
}
從上面粗體字代碼能夠看出,因爲String類提供了get(index)方法,所以程序便可經過str[2]這樣的索引運算符來獲取指定索引的字符;而Java的ArrayList則提供了get(index)和set(index, val)方法,所以程序可經過索引運算符獲取或修改指定索引處的集合元素。
提示:這其實也是Kotlin的語法糖。
3.1.6 調用運算符
調用運算符對應的固定方法名依次如表3.6所示。
表3.6 調用運算符
運算符 對應的方法
a() a.invoke()
a(b) a.invoke(b)
a(b1, b2) a.invoke(b1, b2)
a(b1, b2, b3, ...) a.invoke(b1, b2, b3, ...)
從上面能夠看出,調用運算符其實就是能夠省略invoke方法名。例如以下程序:
程序清單:codes\03\3.1\InvokeTest.kt
fun main(args: Array<String>) {
val s = "java.lang.String"
// 使用反射獲取String類的length()方法
val mtd = Class.forName(s).getMethod("length")
// 使用傳統方法,使用Method對象的invoke()方法
println(mtd.invoke("java")) // 輸出4
// 使用調用運算符
println(mtd("java") // 輸出4
}
上面兩行粗體字代碼的本質是同樣的,因爲Method類提供了invoke()方法,所以程序便可按傳統Java方式調用invoke()方法,也可直接使用調用運算符進行調用。
3.1.7 廣義賦值
廣義賦值運算符對應的固定方法名依次如表3.7所示。
表3.7廣義賦值運算符
運算符 對應的方法
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 = a + b,所以程序中使用a += b運算時,每每並不須要a有plusAssign()方法。
對於a += b表達式,Kotlin實際執行過程以下。
對於廣義賦值操做,例如 a += b,編譯器會先判斷plusAssign()方法是否存在,若是該方法存在則按以下步驟執行。
(1)若是plus()方法也存在,Kotlin將會報告錯誤(調用的目標方法不肯定)。
(2)確保plusAssign沒有返回值,不然報告錯誤。
注意:Kotlin的賦值運算不是表達式,所以不須要返回值。
(3)若是能經過前2步的檢查,轉換爲執行a.plusAssign(b)。
若是a變量的plusAssign()方法不存在,a += b將轉化爲a = a + b 代碼。
3.1.8 相等與不等運算符
==和!=對應的固定方法名依次如表3.8所示。
表3.8 相等和不等運算符
運算符 對應的方法
a == b a?.equals(b) ?: (b === null)
a != b !(a?.equals(b) ?: (b === null)))
從上面介紹能夠看出,Kotlin的==再也不比較兩個變量是否引用同一個對象。實際上==與equals()比較基本是等義的,只不過==比較起來是空指針安全的。例如以下程序。
程序清單:codes\03\3.1\EqualsTest.kt
fun main(args: Array<String>) {
var s1 = java.lang.String("java")
var s2 = java.lang.String("java")
println(s1 == s2); // 輸出true
println(s1.equals(s2)); // 輸出true
}
上面兩行粗體字代碼的本質是同樣的,所以雖然s一、s2兩個變量指向兩個不一樣的字符串,但上面兩行粗體字代碼依然會輸出true。
Java提供的==和!=在Kotlin則改成由===和!==代替了,以下代碼將會輸出false。
println(s1 === s2); // 輸出false
上面s1 === s2判斷時纔要求s一、s2兩個變量指向同一個對象。
3.1.9 比較運算符
比較運算符對應的固定方法名依次如表3.9所示。
表3.9 比較運算符
運算符 對應的方法
a > b a.compareTo(b) > 0
a < b a.compareTo(b) < 0
a >= b a.compareTo(b) >= 0
a <= b a.compareTo(b) <= 0
從上面介紹能夠看出,比較運算符其實就是由compareTo()方法來實現的,而該方法是Comparable接口中定義的方法,所以原來Java類中支持使用compareTo()方法比較大小的對象,均可使用比較運算符進行計算。例如以下代碼。
程序清單:codes\03\3.1\CompareTest.kt
fun main(args: Array<String>) {
var s1 = "java"
var s2 = "kotlin"
// 下面兩行代碼是相同的
println(s1 > s2) // 輸出false
println(s1.compareTo(s2) > 0) // 輸出false
var date1 = java.util.Date()
var date2 = java.util.Date(System.currentTimeMillis() - 1000)
println(date1 > date2) // 輸出true
println(date1.compareTo(date2) > 0) // 輸出true
}
上面程序中使用比較運算符對String、Date兩個類的實例進行大小比較,因爲這兩個類都實現了Comparable接口,所以徹底可使用比較運算符來比較大小(至於各類數值類型,就更能夠比較大小),Kotlin將會把大小比較運算符轉換爲經過compareTo()方法進行比較。
提示:String比較大小的規則是按字符的字符編號大小進行比較——先比較兩個字符串的首字母;若是首字母相同,再比較第二個字母……以此類推,這實際上是Java的知識。
因而可知,使用Kotlin編程時,只要某個類實現Comparable接口,那麼該類的實例便可使用大小比較運算符來比較大小。
以上內容節選自《瘋狂Kotlin講義》:一本讓您最直接認識Kotlin的瘋狂講義
本書即將於2017年11月發售 敬請期待
往期連載