<font face= 黑體>在 Kotlin 中的類與接口 和 Kotlin 空類型安全與智能類型轉換 中咱們已經將 Kotlin 中的類型初步講完了,今天咱們來說 Kotlin中的表達式。java
Kotlin:git
if (a == 3) { c = 4 } else { c = 5 }
<font face= 黑體>上面代碼能夠等價寫成下面這種形式:github
c = if (a == 3) 4 else 5
<font face= 黑體>這個 when 表達式就至關於 Java 裏面的 switch case。segmentfault
Java:安全
switch (a) { case 0: c = 5; break; case 1: c = 100; break; default: c = 20; }
Kotlin:ide
when (a) { 0 -> c = 5 1 -> c = 100 else -> c = 20 } <==> 表達式的寫法 c = when(a) { 0 -> 5 1 -> 100 else -> 20 }
Java:函數
try { c = a / b; } catch (Exception e) { e.printStackTrace(); c = 0; }
Kotlin:this
try { c = a / b } catch (e: Exception) { e.printStackTrace() c = 0 } <==> 表達式的寫法 c = try { c = a / b } catch (e: Exception) { e.printStackTrace() 0 }
<font face= 黑體>Kotlin 的運算符有如下特色:spa
<font face= 黑體>在 Kotlin 中 == 與 equals 徹底等價。code
// 這兩個寫法徹底等價 "Hello" == "World" "Hello".equals("World")
<font face= 黑體>在 Kotlin 中 + 與 plus 徹底等價。
// 這兩個寫法徹底等價 2 + 3 2.plus(3)
val list = listOf(1, 2, 3, 4) 2 in list
val map = mutableMapOf( "Hello" to 2, "World" to 3 ) val value = map["Hello"] map["World"] = 4
...
<font face= 黑體>這裏只舉幾個運算符來說,具體你們能夠查看官網的運算符的用法。
<font face= 黑體>運算符重載就是對已有的運算符賦予他們新的含義,重載的修飾符是 operator。
<font face= 黑體>運算符重載咱們能夠看下面這個例子,這裏咱們是對複數 Complex 的運算符進行重載。
//複數 class Complex(var real: Double, var image: Double){ override fun toString() = "$real + ${image}i" } operator fun Complex.plus(other: Complex): Complex { return Complex(this.real + other.real, this.image + other.image) } operator fun Complex.plus(other: Double): Complex { return Complex(this.real + other, this.image) } operator fun Complex.plus(other: Int): Complex { return Complex(this.real + other, this.image) } operator fun Complex.minus(real: Double): Complex { return Complex(this.real - real, this.image) } operator fun Complex.get(index: Int): Double = when(index){ 0 -> this.real 1 -> this.image else -> throw IndexOutOfBoundsException() } fun main() { val c1 = Complex(3.0, 4.0) val c2 = Complex(2.0, 2.0) println(c1 + 2.0) println(c1 + c2) println(c1 + 3) println(c1 - 3.0) println(c1[0]) println(c1[1]) println(c1[2]) }
<font face= 黑體>只有一個參數,且用 infix 修飾的函數。
// 本沒有 vs,自定義一個,不須要類名.方法便可調用 infix fun Int.vs(num: Int): String = when { this - num < 0 -> "$this 小於 $num" this - num > 0 -> "$this 大於 $num" else -> "$this 等於 $num" }
<font face= 黑體>調用:
fun main() { println(5 vs 6) println(5 vs 5) println(7 vs 6) }
<font face= 黑體>運行結果:
<font face= 黑體>咱們先來看一下一個普通函數:
// func 是函數名 fun func() { println("Hello") }
<font face= 黑體>咱們把函數名 func 去掉就變成了匿名函數,以下:
// 去掉 func 變成匿名函數 fun() { println("Hello") }
<font face= 黑體>函數是能夠傳遞的,因此匿名函數天然也能傳遞,以下:
// func 是變量名 var func = fun() { println("Hello") }
<font face= 黑體>咱們知道一個變量是有類型的,那麼 func 變量的類型是什麼呢? func 變量的類型就是匿名函數的類型,以下:
// func/匿名函數的類型是 () -> Unit var func: () -> Unit = fun() { println("Hello") }
<font face= 黑體>咱們之因此說匿名函數的緣由是 Lambda 表達式就是匿名函數的一個更具備表現力的寫法,它本質上就是一個匿名函數。
Java:
Runnable lambda = () -> { System.out.println("Hello"); };
Kotlin:
val lambda = { println("Hello") }
// 類型是 () -> Unit val lambda: () -> Unit = { println("Hello") } // 類型是 (Int) -> Unit val f1: (Int) -> Unit = { p: Int -> println(p) } <==> 等價寫法 val f1: Function1<Int, Unit> = { p -> println(p) } <==> 類型推倒 val f1 = { p: Int -> println(p) }
<font face= 黑體>Lambda 表達式的最後一行爲返回值,下面這個 Lambda 表達式的意思就是接受一個整型參數,而且返回一個字符串 "Helll"。
val f1 = { p: Int -> println(p) "Hello" }
val f1: Function1<Int, Unit> = { p -> println(p) }
<font face= 黑體>若是 Lambda 表達式只有一個參數的話,能夠省略參數,因此上面的 Lambda 表達式就能夠改爲下面這樣:
val f1: Function1<Int, Unit> = { println(it) }
<font face= 黑體>本篇博客主要講了 Kotlin 中的表達式和運算符,下一節咱們講 Kotin 的函數進階。
源碼 已上傳至 github,有須要能夠直接下載。