前言
本文来自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

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

被折叠的 条评论
为什么被折叠?



