一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解Kotlin 高階函數 與 Lambda 表達式

詳解Kotlin 高階函數 與 Lambda 表達式

2020-11-26 14:31jinkui Java教程

這篇文章主要介紹了詳解Kotlin 高階函數 與 Lambda 表達式的相關資料,需要的朋友可以參考下

詳解Kotlin 高階函數Lambda 表達式

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

?
1
2
3
4
5
6
7
8
fun <T> lock(lock: Lock, body: () -> T): T {
  lock.lock()
  try {
    return body()
  }finally {
    lock.unlock()
  }
}

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

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

?
1
2
3
4
5
6
7
8
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 } // 調用

函數類型(Function Type)

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

引用以及返回一個函數

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

?
1
2
3
4
5
fun bar(): (String) -> String = { str -> str.reversed() }
 
val reversi = bar()
reversi("hello")
reversi("world")

內聯函數(Inline Function)

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

?
1
2
3
inline fun foo() {
  //
}

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

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

Lambda 表達式

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

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

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

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

?
1
ints.filter { it > 0 }

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

?
1
2
3
4
ints.filter {
  val shouldFilter = it > 0
  return@filter shouldFilter
}

匿名函數(Anonymous Function)

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

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

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

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

閉包

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

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

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

原文鏈接:http://www.jianshu.com/p/212e513ea713

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 99er在线视频 | 教师系列 大桥未久在线 | 欧美亚洲视频在线观看 | 国产亚洲视频在线 | 国产精品嫩草影院在线看 | 2020年精品国产午夜福利在线 | 大又大又粗又爽女人毛片 | 欧美人与日本人xx在线视频 | 羞羞漫画免费漫画页面在线看漫画秋蝉 | 岛国在线播放v片免费 | 日韩在线视频免费不卡一区 | dasd-698黑人在线播放 | 免费观看视频在线 | 小早川怜子亚洲综合中文字幕 | 草草国产成人免费视频 | 国产在线看片网站 | 国产精品久久久久久久久久久久久久 | 女主被当众调教虐np | 亚洲欧洲日产国码 最新 | 美国艳星lisann成人作品 | 青草国产在线视频 | 星星动漫在线观看无删减 | 黑人好大好硬好深好爽想要h | 国产在视频线精品视频 | 亚洲欧美久久一区二区 | 天堂资源在线8 | 我与恶魔的h生活ova | 欧美草逼视频 | 2022国产麻豆剧传媒古装 | 高清色黄毛片一级毛片 | 亚洲视频男人的天堂 | 五月婷婷丁香在线视频 | 男女羞羞的视频 | 三级网站午夜三级 | 高h生子双性美人受 | 大奶妈咪女教师 | 俺去俺来也在线www色官网 | 啪啪免费入口网站 | 大肚孕妇的高h辣文 | 久久精品亚洲热综合一本 | 亚洲卡一卡2卡三卡4麻豆 |