[英]Kotlin : When and How Should One Use Lambda Expressions
我最近一直在為我的 Android 項目轉向 Kotlin,但在理解 Lambda 時遇到了問題。 當我們將 Java 文件轉換為 Kotlin 文件時,我們會看到許多 lambda 表達式。
何時以及如何准確使用 lambda 函數? 另外,高階函數和 lambda 函數/表達式之間有什么區別?
專門針對 Android 的答案會有所幫助。
何時以及如何准確使用 lambda 函數? 另外,高階函數和 lambda 函數/表達式之間有什么區別?
lambda是一個匿名函數。 它允許您在不命名函數的情況下編寫函數。
高階函數是將另一個函數作為參數(通常作為lambda傳遞)或作為結果返回一個函數的函數。
很難告訴您何時真正應該使用 lambda。 正如已經看到的,高階函數可能是主要用例。 這是將“應該做什么”傳遞給另一個函數的好方法。 許多標准函數確實使用它。 一個簡單的例子是集合上的forEach
:
listOf(1,2,3).forEach{
//tell what to do with each element in this lambda
}
對於Lambda
{a:Int, b:Int -> a + b} // lambda of function type: (Int, Int) -> Int
// Equivalent function
fun sum(a:Int , b:Int) = a + b
--) 我們可以將 lambda 賦值給一個類似函數類型的變量:
var sum: (Int, Int) -> Int = {a:Int, b:Int -> a + b}
--)可以不寫參數類型。
val sum: (Int, Int) -> Int = {a , b -> a + b}
println(sum(2,3)) // call sum
帶有單個參數的 Lambda 是一個特例。
單個參數可以與箭頭->
一起省略,並將其用作對單個參數的引用。
常規方式: var increment: (Int) -> Int = { a -> a + 1 }
特殊情況,單個參數被引用為var increment: (Int) -> Int = { it + 1 }
val sum: (Int, Int) -> Int = {a , b ->
println("a = $a")
println("b = $b")
a + b // last expression is returned
}
從示例中,默認情況下,隱式返回 lambda 的最后一個表達式。
匿名函數也是一個字面函數,這意味着它沒有被聲明而是作為表達式傳遞。 匿名函數是沒有名稱的常規函數。 與常規函數類似,匿名函數也有函數類型。
var sum: (Int, Int) -> Int = fun(x: Int, y: Int): Int = x + y
println(sum(2,3)) // call sum
--)高階函數可以將函數作為參數或返回一個函數。
--)接受函數的參數類型或返回類型使用函數類型聲明。
// Higher-Order Function
fun higherOrderSum(a:Int, b:Int, f: (Int, Int) -> Int): Int{
return f(a,b)
}
typealias someType = (Int, Int) -> Int
fun main() {
val lambdaSum: someType = {a , b -> a + b}
println(higherOrderSum(2, 3, lambdaSum)) // 5
}
val view = findViewById(R.id.welcomeMessage)
view.setOnClickListener { v -> navigateWithView(v) }
如您所見,左側定義函數的輸入值(在本例中為視圖),右側聲明函數將執行的操作。
fun setOnClickListener(listener: (view: View) -> Unit){}
這被稱為高階函數,因為它是一個通過參數接收函數或返回函數的函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.