Kotlin:何时以及如何使用Lambda表达式

时间:2017-11-04 12:44:36

标签: android lambda kotlin

我最近一直在为我的Android项目转移到Kotlin,并且在理解Lambdas时遇到了问题。当我们将Java文件转换为Kotlin文件时,我们会看到许多lambda表达式。

何时以及如何使用lambda函数?另外,高阶函数和lambda函数/表达式之间有什么区别?

特别针对Android的上下文中的答案会有所帮助。

2 个答案:

答案 0 :(得分:4)

  

何时以及如何使用lambda函数?什么是   高阶函数和lambda之间的区别   功能/表达

lambda 是一个匿名函数。它允许您在不命名的情况下编写函数。

高阶函数是一个函数,它将另一个函数作为参数(通常作为 lambda 传递)返回一个函数结果。

很难告诉你什么时候应该使用lambda。如前所述,高阶函数可能是主要的用例。这是将“应该做什么”传递给另一个函数的好方法。许多标准函数都使用它。一个简单的例子是集合上的forEach

listOf(1,2,3).forEach{
   //tell what to do with each element in this lambda
}

查找lambdas的好地方是DSLs,例如Anko库包含一个。这些结构也大量使用了lambda。

答案 1 :(得分:1)

对于 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
   }

Android中的Lambda

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

如您所见,左侧定义了函数的输入值(在本例中为视图),右侧定义了函数将执行的操作。

如何定义一个接受lambda的函数

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

这被称为高阶函数,因为它是通过参数接收函数或返回函数的函数。