最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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 } // 調用

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

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

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

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

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

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

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

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

inline fun foo() {
  //
}

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

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

Lambda 表達式

Lambda 表達式的完整語法形式,如:

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

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

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

ints.filter { it > 0 }

使用 帶標簽限定的 return 語法, 我們可以在 Lambda 表達式內明確地返回一個結果值. 否則, 會隱含地返回 Lambda 表達式內最后一條表達式的值。

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)

閉包

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

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


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

相關文章

  • Java中的遞增i++與++i的實現(xiàn)原理詳解

    Java中的遞增i++與++i的實現(xiàn)原理詳解

    這篇文章主要介紹了Java中的i++與++i的實現(xiàn)原理詳解,在Java中,i++是一種常見的遞增操作符,用于將變量i的值增加1,它是一種簡潔且方便的方式來實現(xiàn)循環(huán)和計數(shù)功能,i++可以用于各種情況,本文來看一下其實現(xiàn)原理,需要的朋友可以參考下
    2023-10-10
  • Java設計模式之工廠方法模式詳解

    Java設計模式之工廠方法模式詳解

    工廠方法模式(FACTORY METHOD)是一種常用的類創(chuàng)建型設計模式,此模式的核心精神是封裝類中變化的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、復用和方便后期維護拓展的目的。它的核心結構有四個角色,分別是抽象工廠、具體工廠、抽象產品、具體產品
    2022-08-08
  • Java中Optional.of()方法及源碼解析(非常詳細!)

    Java中Optional.of()方法及源碼解析(非常詳細!)

    這篇文章主要給大家介紹了關于Java中Optional.of()方法及源碼解析的相關資料,Java中java.util .Optional類的of()方法用于獲得該Optional類中具有指定類型的指定值的一個實例,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-06-06
  • springboot使用外置tomcat啟動方式

    springboot使用外置tomcat啟動方式

    這篇文章主要介紹了springboot使用外置tomcat啟動方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java8實現(xiàn)list集合中按照某一個值相加求和,平均值等操作代碼

    java8實現(xiàn)list集合中按照某一個值相加求和,平均值等操作代碼

    這篇文章主要介紹了java8實現(xiàn)list集合中按照某一個值相加求和,平均值等操作代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • JAVA中的隊列(Queue)詳解

    JAVA中的隊列(Queue)詳解

    這篇文章主要介紹了JAVA中的隊列(Queue)詳解,隊列是一種特殊的線性表,遵循先入先出、后入后出的基本原則,一般來說,它只允許在表的前端進行刪除操作,需要的朋友可以參考下
    2023-07-07
  • Java數(shù)據(jù)類型之引用數(shù)據(jù)類型解讀

    Java數(shù)據(jù)類型之引用數(shù)據(jù)類型解讀

    這篇文章主要介紹了Java數(shù)據(jù)類型之引用數(shù)據(jù)類型,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java 數(shù)據(jù)結構之刪除鏈表中重復的結點

    Java 數(shù)據(jù)結構之刪除鏈表中重復的結點

    在一個排序的鏈表中,會存在重復的結點,如何實現(xiàn)刪除該鏈表中重復的結點,重復的結點不保留,并返回鏈表頭指針呢?接下來小編將帶你詳細介紹
    2021-12-12
  • springboot集成開發(fā)實現(xiàn)商場秒殺功能

    springboot集成開發(fā)實現(xiàn)商場秒殺功能

    這篇文章主要介紹了springboot集成實現(xiàn)商品秒殺功能,秒殺系統(tǒng)業(yè)務流程,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • java8 多個list對象用lambda求差集操作

    java8 多個list對象用lambda求差集操作

    這篇文章主要介紹了java8 多個list對象用lambda求差集操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

佳木斯市| 靖远县| 新宾| 巢湖市| 清水河县| 望城县| 林周县| 温州市| 长宁区| 迁安市| 鹿泉市| 富阳市| 黎城县| 杂多县| 凤凰县| 枝江市| 阜城县| 绥中县| 吉水县| 江油市| 海晏县| 福建省| 通榆县| 天等县| 桦甸市| 融水| 阿拉善左旗| 共和县| 巴塘县| 钟祥市| 德州市| 南川市| 太谷县| 莎车县| 石景山区| 乐亭县| 洱源县| 宜宾县| 江油市| 遂溪县| 婺源县|