簡體   English   中英

Kotlin:何時以及如何使用 Lambda 表達式

[英]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
}

找到 lambdas 的另一個好地方是DSL,例如Anko庫中包含的DSL 這些構造也大量使用了 lambda。

對於Lambda

  • Lambda 是一個文字函數,這意味着它沒有被聲明而是作為表達式傳遞。
  • Lambda 表達式總是用大括號 {...}
  • 如果可以推斷參數類型,則它們是可選的。
  • 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

帶有單個參數的 Lambda 是一個特例。

單個參數可以與箭頭->一起省略,並將其用作對單個參數的引用。

常規方式: var increment: (Int) -> Int = { a -> a + 1 }

特殊情況,單個參數被引用為var increment: (Int) -> Int = { it + 1 }

在 lambda 中返回?

 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
   }

安卓中的Lambda

val view = findViewById(R.id.welcomeMessage)
view.setOnClickListener { v -> navigateWithView(v) }

如您所見,左側定義函數的輸入值(在本例中為視圖),右側聲明函數將執行的操作。

如何定義一個接受 lambdas 的函數

fun setOnClickListener(listener: (view: View) -> Unit){}

這被稱為高階函數,因為它是一個通過參數接收函數或返回函數的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM