1、invoke的作用:
callback?.invoke(default) 相当于 callback( default )
fun mmm() {
//方式1:
val lambda = {
left: Int, right: Int
->
left + right
}
println(lambda(2, 3))
Log.d("LUO","lambda(2, 3)====${lambda(2, 3)}")
Log.d("LUO"," lambda.invoke(3,3)====${ lambda.invoke(3,3)}")
//方式2:
var onlineRewardCoin: ((OnlineTime)->Int)? = null //自定义在线时常金币奖励数
val ll = onlineRewardCoin?.invoke(OnlineTime.FIVE)?:600
Log.d("LUO","ll====${ ll}")
}
大家可以看到我们定义了一个变量 lambda,赋值为一个 Lambda 表达式。Lambda 表达式用一对大括号括起来,后面先依次写下参数及其类型,如果没有就不写,接着写下 -> ,这表明后面的是函数体了,函数体的最后一句的表达式结果就是 Lambda 表达式的返回值,比如这里的返回值就是参数求和的结果。
后面我们用 () 的形式调用这个 Lambda 表达式,其实这个 () 对应的是 invoke 方法,换句话说,我们在这里也可以这么写:
Log.d("LUO"," lambda.invoke(3,3)====${ lambda.invoke(3,3)}")
OnlineTime类:
//在线时常类型
enum class OnlineTime(val value: Int,val nextval: OnlineTime?) {
THIRTY(30, null),
TWENTY_FIVE(25, THIRTY),
TWENTY(20, TWENTY_FIVE),
FIFTEEN(15, TWENTY),
TEN(10, FIFTEEN),
FIVE(5,TEN),
}
2、传参使用
//1、调用
private fun kkk() {
//调用传参
CoinFragment.setOnlineCoinGetter(this) {
when(it.value){
5 -> 500
10 -> 600
15 -> 700
20 -> 800
25 -> 900
30 -> 1000
else -> 1000
}
}
}
//被调用者
object CoinFragment {
//4、接受值
var onlineRewardCoin: ((OnlineTime)->Int)? = null //自定义在线时常金币奖励数
//5、集合的hashMap
var onLineTimeRewardCoinParmas: MutableMap<OnlineTime, Int>
get() {
return mutableMapOf(
OnlineTime.FIVE to (onlineRewardCoin?.invoke(OnlineTime.FIVE)?:600),
OnlineTime.TEN to (onlineRewardCoin?.invoke(OnlineTime.TEN)?:800),
OnlineTime.FIFTEEN to (onlineRewardCoin?.invoke(OnlineTime.FIFTEEN)?:1000),
OnlineTime.TWENTY to (onlineRewardCoin?.invoke(OnlineTime.TWENTY)?:1200),
OnlineTime.TWENTY_FIVE to (onlineRewardCoin?.invoke(OnlineTime.TWENTY_FIVE)?:1400),
OnlineTime.THIRTY to (onlineRewardCoin?.invoke(OnlineTime.THIRTY)?:2000)
)
}
set(value) {}
//2、被调用
fun setOnlineCoinGetter(context: Context, getter: ((OnlineTime)->Int)?) {
//3、赋值给函数
onlineRewardCoin = getter
//6、打印集合的hashMap
Log.d("LUO","======${onLineTimeRewardCoinParmas}")
//{FIVE=500, TEN=600, FIFTEEN=700, TWENTY=800, TWENTY_FIVE=900, THIRTY=1000}
}
}
3、接口的回调使用
private fun nnn() {
//1、调用
show("1"){
// it====true
Log.d("LUO","it====${it}")
}
}
//2、被调用方法
fun show(id: String, result:((Boolean)-> Unit)?) {
if(id.equals("1")){
result?.invoke(true)
return
}
result?.invoke(false)
return
}