kotlin方法的执行 invoke

2021-08-17  本文已影响0人  因为我的心

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
    }
上一篇下一篇

猜你喜欢

热点阅读