Lambda表达式在Kotlin中怎样工作的:setOnClickListener的转换(KAD 18)

作者:Antonio Leiva

时间:Mar 28, 2017

原文链接:https://antonioleiva.com/lambdas-kotlin-android/

Lambda表达式在Kotlin中怎样工作的:setOnClickListener的转换(KAD 18)

虽然,我在其它文章讲过一点Lambda表达式,我愿意更深层次解释Kotlin中Lambda表达式是怎样工作的,以及当我们用Java库时,他们是怎样以Lambda表达式的单一方法转换接口。

特别是我要给出一些例子解释怎样简化Android框架的用法,我们还将详细看到Android视图的setOnClickListener。

SetOnClickListener转换

我最喜欢Kotlin特性之一就是由于有了一些约定它简化Android框架的工作

例如,setOnClickListener函数,在Java中时这样定义的:

public void setOnClickListener(OnClickListener l) {
    ...
 }

而在Kotlin中我们使用它时,可以这样:

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

这节省我们必须创建接口的一个匿名实现,极大地简化了UI组件的初始化工作。

用SetOnclickListener原本方法

依照上面,我们已经节省了足够的代码了,就是我们原必须创建OnClickListener的匿名类:

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

不过你将看到编辑器直接给你的警告,建议你用Lambda方法。

你能够做的转换:

view.setOnClickListener({ v -> toast("Hello") })

简单,对吧?但是,这还能更进一步简化。

 

如果函数的最后一个参数是函数,它能够移到圆括号外面。

因此,我们能够按此提取侦听器:

view.setOnClickListener() { v -> toast("Hello") }

如果我们有多个参数,其余的参数则在圆括号内,即使这些参数是函数。仅仅最后一个参数能够提出来。

 

如果函数仅有一个参数,且它是一个函数,则圆括号能删除

而不是留着空的圆括号,我们最好删除这空的圆括号:

view.setOnClickListener { v -> toast("Hello") }

这就构成了代码块。在这种方法下,我们能够定义我们自己的模型语言DSL。

一个非常典型的例子是Kotlin参考页面,他们构件DSL通过代码创建HTML。

如果你不用Lambda参数,你可以删除函数的左边部分

如果你仅有一个参数这是正确。不使用视图(v),就可以删除它:

view.setOnClickListener { toast("Hello") }

另外,在函数仅接收参数,则不是在左边定义,而是用保留字it,节省一些字符。

例如,如果我们用视图传递它到另一个方法:

view.setOnClickListener { v -> doSomething(v) }

我们可以选择简单的用it:

view.setOnClickListener { doSomething(it) }

Lambda表达式,你的朋友

你见到的这些代码的不同之处是非常重要的。这不仅为你节省了字符(约70%),还极大地提高了代码的可读性

我们只编写真正重要的代码,而跳过那些并没有多大用处的代码。

如果你想进一步学习更多这些知识,能够非常流利创建自己的Android应用程序,我建议你获取这本免费指南,学习怎样构建你的第一个项目,或直接购买这本书,学习怎样从头开始创建一个完整的应用程序。

 

 

相关推荐