【问题标题】:Kotlin : When and How Should One Use Lambda ExpressionsKotlin:何时以及如何使用 Lambda 表达式
【发布时间】:2020-07-16 19:55:30
【问题描述】:

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

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

专门针对 Android 提供的答案会很有帮助。

【问题讨论】:

  • 它们很方便,可以节省您不必要的打字。如果您只关心onClick 事件,则不必写someView.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View?) { Log.v("Foo", "onclick") } }) 之类的东西,您只需说someView.setOnClickListener { Log.v("Foo", "onclick") }
  • 在底层,一个匿名的 OnClickListener 对象仍在创建中,只是 在编译器可以执行此操作时不必显式输入所有内容给你。

标签: android lambda kotlin


【解决方案1】:

何时以及如何准确地使用 lambda 函数?还有,什么是 高阶函数和 lambda 之间的区别 函数/表达式?

lambda 是一个匿名函数。它允许您编写函数而不命名它们。

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

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

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

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

【讨论】:

  • 这有时是可能的,但在大多数情况下你无法判断
  • 所以最后,他们只是节省了我们的时间,避免编写不必要的代码,正如 Michael 所提到的那样。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-03-18
    • 2023-01-25
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多