亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Kotlin 高階函數(shù) 與 Lambda 表達(dá)式

 更新時(shí)間:2017年06月30日 14:57:52   投稿:lqh  
這篇文章主要介紹了詳解Kotlin 高階函數(shù) 與 Lambda 表達(dá)式的相關(guān)資料,需要的朋友可以參考下

詳解Kotlin 高階函數(shù) 與 Lambda 表達(dá)式

高階函數(shù)(higher-order function)是一種特殊的函數(shù), 它接受函數(shù)作為參數(shù), 或者返回一個(gè)函數(shù). 這種函數(shù)的一個(gè)很好的例子就是 lock() 函數(shù), 它的參數(shù)是一個(gè)鎖對象(lock object), 以及另一個(gè)函數(shù), 它首先獲取鎖, 運(yùn)行對象函數(shù), 然后再釋放鎖:

fun <T> lock(lock: Lock, body: () -> T): T {
  lock.lock()
  try {
    return body()
  }finally {
    lock.unlock()
  }
}

上面的代碼: body 參數(shù)是一個(gè) 函數(shù)類型: () -> T , 因此它應(yīng)該是一個(gè)函數(shù), 這個(gè)函數(shù)沒有參數(shù), 返回一個(gè) T 類型的值。

高階函數(shù)類似 C 語言的函數(shù)指針,高階函數(shù)另一個(gè)例子:

fun <T, R> List<T>.map(transform: (T) -> R): List<R> {
  val result = arrayListOf<R>()
  for (item in this)
    result.add(transform(item))
  return result
}

val doubled = ints.map { it -> it * 2 } // 調(diào)用

函數(shù)類型(Function Type)

對于接受另一個(gè)函數(shù)作為自己參數(shù)的函數(shù), 我們必須針對這個(gè)參數(shù)指定一個(gè)函數(shù)類型, 例如前面例子的 map 函數(shù),參數(shù) transform 的類型是 (T) -> R, 意思是它是一個(gè)函數(shù),參數(shù) T, 返回 R。

引用以及返回一個(gè)函數(shù)

高階函數(shù)可以接受函數(shù)參數(shù),也可以返回一個(gè)函數(shù)引用, 函數(shù)可以賦值給變量,和 C 語言的函數(shù)指針一樣。

fun bar(): (String) -> String = { str -> str.reversed() }

val reversi = bar()
reversi("hello")
reversi("world")

內(nèi)聯(lián)函數(shù)(Inline Function)

Kotlin 支持內(nèi)聯(lián)函數(shù),函數(shù)內(nèi)聯(lián)也許會(huì)導(dǎo)致編譯產(chǎn)生的代碼尺寸變大, 但如果我們使用合理(不要內(nèi)聯(lián)太大的函數(shù)), 可以換來性能的提高。

inline fun foo() {
  //
}

如果一個(gè)內(nèi)聯(lián)函數(shù)的參數(shù)中有多個(gè) Lambda 表達(dá)式, 而你只希望內(nèi)聯(lián)其中的一部分, 你可以對函數(shù)的一部分參數(shù)添加 noinline 標(biāo)記。

inline fun foo(inlined: () -> Unit, noinline notInlined: () -> Unit) {
  // ...
}

Lambda 表達(dá)式

Lambda 表達(dá)式的完整語法形式,如:

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

Lambda 表達(dá)式包含在大括號之內(nèi), 在完整語法形式中, 參數(shù)聲明在圓括號之內(nèi), 參數(shù)類型的聲明可選, 函數(shù)體在 -> 符號之后. 如果 Lambda 表達(dá)式自動(dòng)推斷的返回值類型不是 Unit , 那么 Lambda 表達(dá)式函數(shù)體中, 最后一條(或者就是唯一一條)表達(dá)式的值, 會(huì)被當(dāng)作整個(gè) Lambda 表達(dá)式的返回值。

很多情況下 Lambda 表達(dá)式只有唯一一個(gè)參數(shù). 如果 Kotlin 能夠自行判斷出 Lambda 表達(dá)式的參數(shù)定義,那么它將允許我們省略唯一一個(gè)參數(shù)的定義, 并且會(huì)為我們隱含地定義這個(gè)參數(shù), 使用的參數(shù)名為 it :

ints.filter { it > 0 }

使用 帶標(biāo)簽限定的 return 語法, 我們可以在 Lambda 表達(dá)式內(nèi)明確地返回一個(gè)結(jié)果值. 否則, 會(huì)隱含地返回 Lambda 表達(dá)式內(nèi)最后一條表達(dá)式的值。

ints.filter {
  val shouldFilter = it > 0
  return@filter shouldFilter
}

匿名函數(shù)(Anonymous Function)

匿名函數(shù)看起來與通常的函數(shù)聲明很類似, 區(qū)別在于省略了函數(shù)名。

fun(x: Int, y: Int): Int = x + y

參數(shù)和返回值類型的聲明與通常的函數(shù)一樣, 但如果參數(shù)類型可以通過上下文推斷得到, 那么類型聲明可以省略:

ints.filter(fun(item) = item > 0)

閉包

所謂閉包,就是一個(gè)代碼塊可以訪問外層作用域的變量和參數(shù),例如上面提到的 Lambda 表達(dá)式和匿名函數(shù)。

var containsNegative = false
val ints = listOf(0, 1, 2, 3, 4, 5)
ints.forEach {
  if (it < 0)
  containsNegative = true
}


感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • springcloud微服務(wù)基于redis集群的單點(diǎn)登錄實(shí)現(xiàn)解析

    springcloud微服務(wù)基于redis集群的單點(diǎn)登錄實(shí)現(xiàn)解析

    這篇文章主要介紹了springcloud微服務(wù)基于redis集群的單點(diǎn)登錄實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • ThreadPoolExecutor線程池的使用方法

    ThreadPoolExecutor線程池的使用方法

    這篇文章主要為大家詳細(xì)介紹了ThreadPoolExecutor線程池的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • springboot3集成mybatis-plus報(bào)sqlSession異常的問題解決

    springboot3集成mybatis-plus報(bào)sqlSession異常的問題解決

    springboot3已經(jīng)發(fā)布正式版,但是在集成mybatis-plus最新版3.5.2的時(shí)候發(fā)現(xiàn)提示異常,本文就來介紹一下報(bào)sqlSession異常的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • java秒殺系統(tǒng)常見問題庫存超賣解決實(shí)例分析

    java秒殺系統(tǒng)常見問題庫存超賣解決實(shí)例分析

    這篇文章主要為大家介紹了java秒殺系統(tǒng)常見問題庫存超賣解決實(shí)例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • java中的反射及其優(yōu)點(diǎn)說明

    java中的反射及其優(yōu)點(diǎn)說明

    這篇文章主要介紹了java中的反射及其優(yōu)點(diǎn)說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java?阻塞隊(duì)列BlockingQueue詳解

    Java?阻塞隊(duì)列BlockingQueue詳解

    本文詳細(xì)介紹了BlockingQueue家庭中的所有成員,包括他們各自的功能以及常見使用場景,通過實(shí)例代碼介紹了Java?阻塞隊(duì)列BlockingQueue的相關(guān)知識(shí),需要的朋友可以參考下
    2022-06-06
  • Java基礎(chǔ)之匿名內(nèi)部類、包裝類

    Java基礎(chǔ)之匿名內(nèi)部類、包裝類

    這篇文章主要給大家介紹了關(guān)于Java中方法使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • JAVA中使用JSON進(jìn)行數(shù)據(jù)傳遞示例

    JAVA中使用JSON進(jìn)行數(shù)據(jù)傳遞示例

    本篇文章主要介紹了JAVA中使用JSON進(jìn)行數(shù)據(jù)傳遞示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java中String、StringBuffer、StringBuilder的區(qū)別介紹

    Java中String、StringBuffer、StringBuilder的區(qū)別介紹

    這篇文章主要介紹了Java中String、StringBuffer、StringBuilder的區(qū)別介紹,本文講解了可變與不可變、是否多線程安全、gBuilder與StringBuffer共同點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • SpringBoot使用Jasypt對配置文件和數(shù)據(jù)庫密碼加密

    SpringBoot使用Jasypt對配置文件和數(shù)據(jù)庫密碼加密

    在做數(shù)據(jù)庫敏感信息保護(hù)時(shí),應(yīng)加密存儲(chǔ),本文就來介紹一下SpringBoot使用Jasypt對配置文件和數(shù)據(jù)庫密碼加密,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02

最新評論