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

作者:Antonio Leiva

时间:Mar 28, 2017

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

 

 

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

 

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

 

SetOnClickListener转换

 

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

 

 

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

1 public void setOnClickListener(OnClickListener l) {
2    ...
3 }

 

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

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

 

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

 

SetOnclickListener原本方法

 

 

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

1 view.setOnClickListener(object : View.OnClickListener {
2     override fun onClick(v: View?) {
3         toast("Hello")
4     }
5 })

 

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

 

你能够做的转换:

 

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

 

 

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

 

 

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

 

 

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

 

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

 

 

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

 

 

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

 

 

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

 

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

 

 

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

 

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

 

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

 

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

1 view.setOnClickListener { toast("Hello") }

 

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

 

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

 

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

 

 

我们可以选择简单的用it

1 view.setOnClickListener { doSomething(it) }

 

Lambda表达式,你的朋友

 

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

 

 

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

 

 

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

 

 

 

 

 

 

 

 

 

 

posted @ 2017-04-02 14:59  figozhg  阅读(10814)  评论(0编辑  收藏  举报