观心静

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

前言

  在体验kotlin后,你一定会kotlin实现一些简单的接口回调方法的lambda印象深刻。例如下面的代码:

        val button = Button(this)
        button.setOnClickListener { 
            //在此处实现点击逻辑
        }

这大大的减少了重复的模板代码。提高了代码的阅读效率。所以,此篇博客讲解我们如何实现这种lambda接口回调。

 

回调lambda

代码

class MainActivity : AppCompatActivity() {
    private lateinit var listener: (String) -> Unit 

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        setOnListener { textView.text = it }

        Handler().postDelayed(Runnable {
            listener.invoke("触发成功")
        }, 1000)

    }

    fun setOnListener(str: (String) -> Unit){
        listener = str
    }
}

1.首先在创建一个延后初始化的全局变量 private lateinit var listener: (String) -> Unit

2.然后实现setOnListener方法

3.最后的重点是使用invoke发布数据,我这里使用了一个Handler模拟延迟的数据回调

 

其他

class FunTest {
    /**
     *   funTest.example { s, i -> println("$s $i") }
     */
    fun example(out: (String, Int) -> Unit) {
        out("11", 1)
    }

    /**
     * 非内联函数
     *     funTest.example2 {if (it.isEmpty()) return@example2 }
     */
    fun example2(str: (String) -> Unit) {
        str.invoke("demo")
    }

    /**
     * 内联函数
     *      funTest.example2_1 {if (it.isEmpty()) return}

     */
    inline fun example2_1(str: (String) -> Unit) {
        str.invoke("demo")
    }

    /**
     * funTest.example3( str1 = { println(it) }, str2 = { println(it)})

     */
    inline fun example3(str1: (String) -> Unit, str2: (String) -> Unit) {
        str1("str1")
        str2("str2")
    }
    
}

 

 

 

 

End

posted on 2020-09-22 16:28  观心静  阅读(1179)  评论(0编辑  收藏  举报