【Kotlin】Kotlin的高阶函数与Lambda表达式

本文详细介绍了Kotlin中的高阶函数,包括其定义、在Java和Kotlin中的应用,以及Lambda表达式的本质、使用方法和原理。通过实例和字节码分析,揭示了函数作为参数传递和Lambda表达式的实现机制。

前言

本文来自https://blog.youkuaiyun.com/devnn,未经允许禁止转载

Kotlin的高阶函数与Lambda表达式是Kotlin的两大特色,使用频率非常高。熟悉它的用法与本质对于简化代码、提升开发效率非常有帮助。
这两个概念不是同一个东西,但是又有非常紧密的关联。这篇文章带你弄懂什么是高阶函数,以及Lambda表达式的本质和使用。

一、什么是高阶函数

高阶函数就是将函数类型用作参数或返回值的函数,例如:

函数类型当作参数
  fun a(arg:(Int)->String):String{
   
   
    arg(1)
  }
函数类型当作返回值
  fun b(arg:(Int)->String):(Int)->Unit{
   
   
    ...
  }
什么是函数类型

Kotlin 使用类似 (Int) -> String 的一系列函数类型来处理函数的声明。
例如onClick的赋值操作:

val onClick: (View) -> Unit = ……

其中(View) -> Unit就是一种函数类型。

二、在Java里如何将函数当作参数传给另一个函数

在Java里不能将函数当作参数传给另一个函数,但是有一个变通的方案,就是将函数包装成Interface。比如点击事件,将onClick函数包装成OnClickListener传递给View的setOnClickListener函数:

public interface OnClickListener{
   
   
    void onClick(View view) 
}

OnClickListener onClickListener=new OnClickListener{
   
   
  	@Override
  	public void onClick(View view){
   
   
  	  doSomething();
    }
}
view.setOnClickListener(onClickListener);

View的源码简化:

public class View{
   
   

	OnClickListener mOnClickListener;
	
	public void setOnClickListener(OnClickListener onClickListener){
   
   
	
		this.mOnClickListener=onClickListener
	
	}
	
	public void onTouchEvent(MotionEvent motionEvent){
   
   
	    ...
		mOnClickListener.onClick(this);
		...
	}
	
}

三、在Kotlin里如何将函数当作参数传给另一个函数

先看这两个函数:

   //定义一个参数为函数类型的函数(高阶函数)
  fun a(arg:(Int)->String):String{
   
   
    arg(1)
  }

   //定义一个接受Int返回String的函数
  fun b(arg:Int):String{
   
   
    return arg.toString()
  }

如何在调用a的时候将b作为实参传给a呢?首先要将函数b实例化变成对象才能传递。

(1)使用双冒号实例化函数
 
 a(b)  //错误写法,编译不通过。不能将函数本身直接传递。b没有实例化,不是对象
 
 a(::b) //正确写法,将b用双冒号实例化再进行传递
 
 val d= ::b  //将b实例化赋值给d
 
 a(d) //正确写法,d已经是函数对象。

(2)使用匿名函数实例化函数

所谓匿名函数,就是没有名字的函数,比如

fun(arg
<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] 相关问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值