Kotlin Lambda和高阶函数

Lambda和高阶函数

本文链接:

lambda

1、lambda的由来

  1. 单词"lambda"源于希腊字母λ(小写lambda)
  2. "Lambda"一词最早起源于数学中的λ演算(lambda calculus),它是一种函数定义和函数应用的形式系统,由逻辑学家阿隆佐·邱奇(Alonzo Church)在20世纪30年代发明。
  3. 邱奇使用λ作为演算中的一个操作符,用于表示匿名函数。他选择使用希腊字母λ的原因是因为它在字母表中的位置不太常见,这样可以避免与其他符号混淆。

2、函数的声明

    // 函数的声明
    val method01:()->Unit
    val method02:(Int, Int)->Unit
    val method03:(String, Double)->Any // 相当于Object
    val method04:(String, Double, Float)->Boolean

3、kotlin中Any和Java的Object有什么区别吗?

  1. Any是所有非空类型的超类型,类似于Java中的Object。Object不能持有null。
  2. Any?是所有类型的超类型,包括可空类型。
    Any?可以持有null值

4、函数如何调用/函数的实现(lambda)?invoke是什么?

// 函数变量通过invoke()调用
// ()是运算符重载
// 函数的实现
val method01:()->Unit
method01 = {
   
    println("我实现了method01") }
method01() // 调用函数:操作符重载
method01.invoke() // 调用函数:真实方法


// 方法三的实现
val method03:(String, Double)->Any // 相当于Object
method03 = {
   
   name, number ->
    println("$name $number")
    name + number
}
println(method03("wch", 1234567.89))

5、函数的实现(传入函数)

val method04:(String, Double, Float)->Boolean
    = fun(name:String, number:Double, age:Float):Boolean = (name+number+age).isEmpty()
method04("wch", 376.23, 1234.5f)

6、单一参数的lambda默认持有it ===> 函数式接口 ===> SAM

    val method05:(Int)->Unit = {
   
   
        print("$it")
    }

7、下划线可以拒收 ===> 拒收

    val method06:(Int, Int)->Unit = {
   
    _, number->
            println("$number")
    }

8、作用是什么?

  1. 节省空间
  2. 接口版本变化,有的参数没用了

9、想要允许参数为null,需要用可空类型如String?

val method07:(String?,String)->Unit = {
   
   
        sex, name -> println("$sex,$name")
    }

method07(null, "wch")

10、Lambda不可以使用泛型作为参数类型
11、Lambda参数不可以给默认值 ===> 默认参数
12、Lambda Any->Any

    // 传入什么,打印什么,还可以返回任何东西
    val method18:(Any)->Any={
   
   
        println("$it")
        it // 还可以返回自己
    }

13、Lambda配合扩展方法 ===> 扩展方法 ===> 官网写的Funciton,但是接收receiver

    val method19: String.()->Unit = {
   
   
        // this = String本身 == 调用者本身
        println("你是$this")
    }
    "WCH".method19()

14、为什么method19可以成为String的扩展方法?

  1. 代码val method19: String.()->Unit = { ... }表示定义了一个接收者类型为String的扩展函数类型。
  2. String.()->Unit表示该函数类型接收一个String作为接收者,并返回Unit类型(即没有返回值)。
  3. 进一步理解:==> 匿名扩展函数
val method18: ()->Unit; // 类型是 函数
val method19: String.()->Unit // 类型是 String的扩展函数
val method20: (String)->Unit // 类型是 函数,该函数的参数是String

15、进一步融合this和it,区分扩展函数 和 参数的区别

val method20: Int.(Int) -> String = {
   
   "两数相加的结果:${
     
     this+it}"}
println(1.method20(10))

println(method20(1, 10)) // 1, 可以自动插为第一个参数

函数的形式:

fun Int.method21(n:Int):String{
   
   
    return "两数相加的结果:${
     
     this+n}"
}
println(2.method21(22))
// println(method21(2, 22)) // 不可以这样写了

输出(返回类型)

1、Lambda的返回类型:函数

    /**============================
     * 函数
     *============================*/
    // 默认Unit
    fun t01(){
   
    println() }
    // 默认Unit
   
<think>好的,我现在需要帮助用户了解Kotlin中的高阶函数列表及其用法。首先,我得回顾一下高阶函数的基本概念,确保自己理解正确。高阶函数指的是那些以函数作为参数或者返回函数的函数。用户可能已经知道这一点,但还是要先明确。 接下来,用户需要具体的列表用法示例。根据提供的引用,Standard.kt中的常用高阶函数有let、with、apply、also、run等,还有Collections中的map、filter等。我需要把这些整理出来,每个函数的用法区别讲清楚,比如apply返回对象本身,而let返回lambda的结果。 然后,用户可能对每个函数的具体使用场景不太清楚,所以需要举一些实际的例子。比如用let处理可空变量,用with来简化对象操作。同时,要提到内联函数的概念,因为引用3提到内联函数可以减少开销,这对性能优化很重要,可能需要解释一下inline关键字的作用。 还要注意用户提供的代码示例,比如引用2中的map函数,应该展示如何用高阶函数转换列表。另外,引用4中的尾递归问题,虽然高阶函数不直接相关,但可能涉及递归函数优化,不过用户的问题主要集中在高阶函数列表,所以暂时可能不需要深入讨论尾递归,但如果有相关的高阶函数应用,可以提及。 需要确保回答结构清晰,分点列出每个高阶函数,并给出用法示例。同时,引用对应的参考资料,比如在讲内联函数时引用3,讲集合操作时引用2,这样用户知道信息来源。 另外,用户可能对如何自定义高阶函数感兴趣,所以需要包含一个自定义的例子,比如锁操作或者事件监听,这样展示如何将函数作为参数传递。 最后,生成相关问题的时候,要考虑用户可能进一步想了解的内容,比如高阶函数的性能优化、与Java的对比、常见错误等,这样可以引导他们深入探索。</think>### Kotlin 高阶函数详解 #### 一、高阶函数定义 高阶函数(Higher-Order Function)是指将函数作为参数或返回值的函数。其核心思想是通过函数抽象化操作逻辑,提升代码复用性简洁性[^1]。 #### 二、常用高阶函数列表及用法 1. **Standard.kt 核心函数** - **`let`** 用途:处理可空对象、作用域隔离 ```kotlin val result = obj?.let { it.doSomething() // 安全调用非空对象 it.value * 2 // 返回最后一行结果 } ``` - **`with`** 用途:简化对象操作 ```kotlin val str = with(StringBuilder()) { append("Hello") append(" World") toString() // 返回最后一行结果 } ``` - **`apply`** 用途:对象初始化 ```kotlin val view = TextView(context).apply { text = "Kotlin" textSize = 16f } // 返回对象本身 ``` - **`also`** 用途:附加操作(类似`apply`但更侧重副作用) ```kotlin val list = mutableListOf(1,2,3).also { println("原始列表: $it") // 打印日志后返回原列表 } ``` - **`run`** 用途:结合`with``let`特性 ```kotlin val length = obj?.run { this.calculateLength() // 访问对象属性 } ?: 0 ``` 2. **集合操作函数** - **`map`**(引用[2]示例) 用途:元素转换 ```kotlin val doubled = listOf(1,2,3).map { it * 2 } // [2,4,6] ``` - **`filter`** 用途:筛选元素 ```kotlin val evens = listOf(1,2,3).filter { it % 2 == 0 } // [2] ``` - **`forEach`** 用途:遍历集合 ```kotlin listOf("A","B").forEach { println(it) } ``` 3. **内联高阶函数**(引用[3]) 使用`inline`关键字优化性能,避免lambda表达式生成额外对象: ```kotlin inline fun lock(lock: Lock, action: () -> Unit) { lock.lock() try { action() } finally { lock.unlock() } } ``` #### 三、自定义高阶函数示例 实现回调接口: ```kotlin fun setOnClickListener(listener: (View) -> Unit) { view.setOnClickListener { v -> listener(v) } } // 调用 setOnClickListener { showToast("Clicked!") } ``` #### 四、注意事项 1. **Lambda参数约定**:若最后一个参数是函数,可将lambda移至括号外 ```kotlin list.map { it * 2 } // 等价于 list.map({it*2}) ``` 2. **作用域控制**:`run`/`with`使用`this`指向对象,`let`使用`it` 3. **内联选择**:频繁调用的高阶函数建议添加`inline`关键字优化性能[^3] 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值