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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值