Kotlin 表達式與運算符

1、前言

<font face= 黑體>在 Kotlin 中的類與接口Kotlin 空類型安全與智能類型轉換 中咱們已經將 Kotlin 中的類型初步講完了,今天咱們來說 Kotlin中的表達式java

2、分支表達式

2.一、if else 表達式

Kotlin:git

if (a == 3) {
    c = 4
} else {
    c = 5
}

<font face= 黑體>上面代碼能夠等價寫成下面這種形式:github

c = if (a == 3) 4 else 5

2.二、when 表達式

<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
}

2.三、try catch 表達式

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
}

3、運算符與中綴表達式

3.一、運算符

<font face= 黑體>Kotlin 的運算符有如下特色:spa

  • <font face= 黑體>Kotlin 支持運算符重載;
  • <font face= 黑體>運算符的範圍僅限官方指定的符號;

3.1.一、== 運算符

<font face= 黑體>在 Kotlin 中 == 與 equals 徹底等價。code

// 這兩個寫法徹底等價
"Hello" == "World"
"Hello".equals("World")

3.1.二、+ 運算符

<font face= 黑體>在 Kotlin 中 + 與 plus 徹底等價。

// 這兩個寫法徹底等價
2 + 3
2.plus(3)

3.1.三、in 運算符

val list = listOf(1, 2, 3, 4)
2 in list

3.1.四、[] 運算符

val map = mutableMapOf(
    "Hello" to 2,
    "World" to 3
)
val value = map["Hello"]
map["World"] = 4

...
<font face= 黑體>這裏只舉幾個運算符來說,具體你們能夠查看官網的運算符的用法。

3.二、運算符重載

<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])
}

3.三、中綴表達式

<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= 黑體>運行結果:
結果

4、Lambda 表達式

4.一、匿名函數

<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 表達式就是匿名函數的一個更具備表現力的寫法,它本質上就是一個匿名函數。

4.二、Lambda 表達式的定義

Java:

Runnable lambda = () -> {
    System.out.println("Hello");
};

Kotlin:

val lambda = {
    println("Hello")
}

4.三、Lambda 表達式的類型

// 類型是 () -> 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"
}

4.四、Lambda 表達式的參數省略形式

val f1: Function1<Int, Unit> = { p ->
    println(p)
}

<font face= 黑體>若是 Lambda 表達式只有一個參數的話,能夠省略參數,因此上面的 Lambda 表達式就能夠改爲下面這樣:

val f1: Function1<Int, Unit> = {
    println(it)
}

5、小結

<font face= 黑體>本篇博客主要講了 Kotlin 中的表達式運算符,下一節咱們講 Kotin 的函數進階

6、源碼

源碼 已上傳至 github,有須要能夠直接下載。

相關文章
相關標籤/搜索