zoukankan      html  css  js  c++  java
  • 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应用程序,我建议你获取这本免费指南,学习怎样构建你的第一个项目,或直接购买这本书,学习怎样从头开始创建一个完整的应用程序。

     

     

  • 相关阅读:
    JAVA内部类详解
    表、栈和队列
    大型网站架构演化<二>
    eclipse中build path 中JDK与java compiler compliance level的问题(转)
    XFire构建服务端Service的两种方式
    SpringMVC简单例子
    Mybatis
    java静态代码块 类加载顺序问题。
    Tomcat6.0数据源配置
    解析xml的几种方式
  • 原文地址:https://www.cnblogs.com/figozhg/p/6659075.html
Copyright © 2011-2022 走看看