Kotlin for android lambda表达式

简介

lambda表达式是定义匿名函数的简单方法。lambda非常有用,因为它们防止我们不得不在抽象类或接口中编写函数的规范,然后编写类的实现。
在Kotlin中,我们可以使用一个函数作为另一个函数的参数

简化setOnClickListener()

我将使用Android中的一个典型示例说明这一方法的工作原理:View.setOnClickListener()方法。如果我们想在Java中实现单击侦听器行为,我们首先需要编写OnClickListener接口

public interface OnClickListener{
    void onClick(View v);
}

然后编写一个实现此接口的匿名类:

view.setOnClickListener(new OnClickListener() {
     @Override
     public void onClick(View v) {
     Toast.makeText(v.getContext(), "Click", Toast.LENGTH_SHORT).show();
     }
});

将代码转换为Kotlin(使用Anko toast函数):

view.setOnClickListener(object : OnClickListener {
     override fun onClick(v: View) {
     toast("Click")
     }
})

幸运的是,Kotlin允许对Java库进行一些优化,任何带有单个函数的接口都可以被函数替换。它的工作方式就像我们已经定义了setOnclickListener()一样:

fun setOnClickListener(listener: (View) -> Unit)

lambda表达式由箭头左侧的函数参数(被圆括号包围)和右侧的返回值定义。在这种情况下,我们得到一个视图和返回单元(Nothing)。因此,考虑到这一点,我们可以稍微简化前面的代码:

view.setOnClickListener({ view -> toast("Click")})

差别很大!在定义函数时,我们必须使用花括号并指定箭头左侧的参数值以及函数将在右侧执行的代码。如果不使用参数,甚至可以去掉左边的部分:

view.setOnClickListener({ toast("Click") })

如果函数是函数参数中的最后一个,则可以将其移出括号:

view.setOnClickListener() { toast("Click") }

最后,如果函数是唯一的参数,我们可以去掉括号:

view.setOnClickListener { toast("Click") }

比Java中的原始代码小五倍以上,而且更容易理解。It's Amazing!!。

posted on 2019-05-28 14:05  endian11  阅读(167)  评论(0)    收藏  举报

导航