Kotlin高阶函数

定义:参数有函数类型或者返回值是函数类型的函数,都叫做高阶函数。

fun a(funParam: (Int) -> String): String {
  return funParam(1)
}

要传一个函数类型的参数,或者把一个函数类型的对象赋值给变量有三种方法

fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int {
	val result = operation(num1, num2)
	return result
}

1.双冒号 ::method

在 Kotlin 里,一个函数名的左边加上双冒号,它就不表示这个函数本身了,而表示一个对象,或者说一个指向对象的引用,但,这个对象可不是函数本身,而是一个和这个函数具有相同功能的对象。

fun plus(num1: Int, num2: Int) : Int {
	return num1 + num2
}
val a = num1AndNum2(10, 8, ::plus)

2. 匿名函数

val a = num1AndNum2(10, 8, fun(num1: Int, num2: Int) = num1 + num2)

3.Lambda 表达式(常用)

val a = num1AndNum2(10, 8) {
	n1, n2 -> n1 + n2
} 

内联函数inline

调用高阶函数num1AndNum2时,Lambda表达式变成了函数接口的匿名类实现,然后在invoke()函数中实现了n1+n2的逻辑并将结果返回。每次调用Lambda表达式都会创建一个新的匿名类实例,会造成额外的内存和开销。
Kotlin编译器会将内联函数中的代码在编译时自动替换到调用它的地方,这样就不存在运行时的开销了。一般会把高阶函数声明为内联函数。

inline fun num1AndNum2(num1: Int, num2: Int, operation: (Int, Int) -> Int): Int {
	val result = operation(num1, num2)
	return result
}

noline和crossinline

inline fun inlineFun(block1:() -> Unit, noline block2: () -> Unit) {
}

内联的函数参数类型只允许传递给另外一个内联函数,非内联的函数类型参数可以自由的传递给其他任何函数。内联函数和非内联函数的另一个区别就是Lambda表达式中可以使用return关键字进行函数返回,而非内联函数只能局部返回。

如果在内联高阶函数中创建了另外的Lambda或者匿名类的实现,并且在这些实现中调用函数的参数,就会提示错误。如

inline fun runRunnable(block: () -> Unit) {
	val runnable = Runnable {
		block() // 提示错误
	}
}

因为Lambda表达式允许使用return返回函数,而高阶函数的匿名类实现中不允许使用return造成了冲突。crossinline用于保证内联函数Lambda表达式中一定不会使用return进行函数返回。

inline fun runRunnable(crossinline block: () -> Unit) {
	val runnable = Runnable {
		block() 
	}
}

声明后runRunnable函数的Lambda中无法使用return进行函数返回了,仍然可以使用return@runRunnable进行局部返回

reified 关键字
reified 配合 inline可以将泛型实例化

inline fun <reified T> startActivity(context: Context, block: Intent.() -> Unit) {
	val intent = Intent(context, T::class.java)
	intent.block()
	context.startActivity(intent)
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值