tft每日頭條

 > 圖文

 > kotlin排序口訣

kotlin排序口訣

圖文 更新时间:2024-08-24 03:04:45

kotlin排序口訣?在Kotlin中,函數是一等公民(first class),這意味着函數可以被存儲在變量或者數據結構中,它是有類型的Kotlin使用函數類型來描述一個函數的具體類型一個完整語法的函數類型如下:,我來為大家科普一下關于kotlin排序口訣?下面希望有你要的答案,我們一起來看看吧!

kotlin排序口訣(Kotlin進階系列-函數類型及函數字面值)1

kotlin排序口訣

1. 函數類型

Kotlin中,函數是一等公民(first class),這意味着函數可以被存儲在變量或者數據結構中,它是有類型的。Kotlin使用函數類型來描述一個函數的具體類型。一個完整語法的函數類型如下:

(x:Int, y:Int) -> Int

其特點如下:

  • 函數類型包括三部分,箭頭左側的是函數的參數,描述了參數個數和類型,參數必須用小括号括起來;箭頭處于中間;箭頭右邊是函數返回值的類型。比如上述函數類型的入參是兩個Int型變量,返回值是Int型。注意如果返回值是Unit型時,不能省略不寫。
  • 函數參數的變量名可以省略不寫,例如上述示例可以簡寫為:

(Int, Int) -> Int

  • 函數類型可以有一個額外的接收者類型,它的語法如下:

Int.(Int) -> Int

接收者類型在參數前,和參數所在的小括号用點連接。關于帶接收者的函數類型在之後會詳細講解。

2. 函數類型實例化

既然函數有類型,那函數類型變量的值是什麼呢?這就涉及到函數類型的實例化。函數類型的實例化包括以下幾種常用方式。

  • 使用函數字面值進行賦值。函數字面值的具體含義下文會詳細介紹。函數字面值包括兩種,lambda表達式和匿名函數,其示例如下:

a. lambda表達式:

{ i, j-> this i j }

b. 匿名函數:

fun(s1: Int, s2: Int): Int { return 1 }

  • 使用一個已存在聲明的可調用引用:

a. 頂級,本地,成員或者擴展函數。例如:String::toInt

b. 頂級,成員,或者擴展屬性:List::size

c. 構造函數:::Regex

  • 使用實現了函數類型接口的自定義類的實例。例如:

classIntTransformer:(Int)->Int{ overrideoperatorfuninvoke(x:Int):Int=TODO() } valintFunction:(Int)->Int=IntTransformer()

函數類型的值可以通過invoke操作符調用,以下是示例。

val stringPlus: (String, String) -> String = String::plus println(stringPlus.invoke("<-", "->")) println(stringPlus("Hello, ", "world!"))

3. 函數字面值

函數字面值是指不聲明,而直接作為表達式傳遞的函數。它包括兩種,lambda表達式及匿名函數。

3.1 lambda表達式

lambda表達式的全語法形式如下:

val sum: (Int, Int) -> Int = {x: Int, y: Int -> x y}

其特點如下:

  • lambda表達式必須在大括号中。
  • lambda表達式的參數列表在->左邊,參數類型是可選的,如果其類型可以推斷出來,則類型可以省略。例如上例可簡寫為:

val sum: (Int, Int) -> Int = {x, y -> x y}

  • 如果lambda表達式的返回值不是Unit,其最後一個表達式的值是返回值。例如以下表達式:

val sum: (Int, Int) -> Int = {x, y -> x y x-y }

其返回值是x-y

Kotlin有一個約定:如果函數的最後一個參數是函數,那麼作為相應參數傳入的lambda表達式可以放在圓括号之外。示例如下:

lambda表達式作為參數的高階函數如下:

fun lambdaWrapper(labmda: (Int) -> Int) { labmda.invoke(1) }

其調用示例可以簡寫為:

fun lambdaTest() { lambdaWrapper() { it -> it 1 } }

如果lambda表達式是唯一的參數,那其圓括号可以省略,示例如下:

fun lambdaTest() { lambdaWrapper{ it -> it 1 } }

由于本lambda表達式隻有一個參數,其可以隐式聲明為it,并去掉該參數的聲明和->。示例如下:

fun lambdaTest() { lambdaWrapper{ it 1 } }

Kotlin1.1起,如果lambda表達式的參數未使用,那麼可以用下劃線取代其名稱:

map.forEach { _, value -> println("$value!") }

3.2 匿名函數

lambda表達式不能顯示的指定返回值的類型。如果需要顯示指定返回值的類型,則需要使用匿名函數。匿名函數和普通函數非常類似,除了其函數名被省略。其示例如下:

fun(x: Int, y: Int): Int { return x y }

匿名函數的參數和返回值類型的聲明與常規函數相同,同時類型如果可以推斷出來則可以省略。例如以下示例:

fun anonymousWrapper(labmda: (Int) -> Int) { labmda.invoke(1) } fun anonymousTest() { anonymousWrapper(fun (i: Int): Int { return i 1 }) }

anonymousTest中對匿名函數的調用是完整語法形态,由于參數類型和返回值類型可以推斷,因此,其可以簡寫為

fun anonymousTest() { anonymousWrapper(fun (i) = i 1) }

請注意,匿名函數參數總是在括号内傳遞。 允許将函數留在圓括号外的簡寫語法僅适用于lambda表達式。

lambda表達式與匿名函數之間的另一個區别是非局部返回的行為。一個不帶标簽的return語句總是在用fun關鍵字聲明的函數中返回。這意味着lambda表達式中的return将從包含它的函數返回,而匿名函數中的return将從匿名函數自身返回。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved