kotlon中的Lambdas

2017-07-10  本文已影响0人  Dreamboy_a2ef

Lambda表达式是一种很简单的方法,去定义一个匿名函数。Lambda是非常有用
的,因为它们避免我们去写一些包含了某些函数的抽象类或者接口,然后在类中去
实现它们。在Kotlin,我们把一个函数作为另一个函数的参数。(说了这么多就是想装逼) 直奔主题, 拿 onclick 练练手,先做个对比:
java :

    button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
            toast("java")
      }
    }

kotlin:

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

Lambdas:

    button.setOnClickListener{
        toast("Lambdas")
    }

简洁,这是我想了解Lambdas的主要原因,下面具体介绍一下:

一个lambda表达式通过参数的形式被定义在箭头的左边(被圆括号包围),然后在箭头的右边返回结果值。在这个例子中,我们接收一个View,然后返回一个Unit

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

(Unit 表示没有东西,也可以写要执行的逻辑,比如上面的toast())。所以根据这种思想,我们可以把代码简化成这样(当我们定义了一个方法,我们必须使用大括号包围):

// 在箭头的左边指定参数,在箭头的右边返回函数执行的结果
button.setOnClickListener({listener -> Unit})

如果左边的参数没有使用到,我们甚至可以省略左边的参数:

  // 省略左边的函数  为了便于观看,写入一个吐司
  button.setOnClickListener({ toast("Lambdas") })

如果这个函数的最后一个参数是一个函数,可以把这个函数移动到圆括号外面:

  // 移动函数(即大括号中的东西)
  button.setOnClickListener(){ toast("Lambdas") }

并且,最后,如果这个函数只有一个参数,我们可以省略这个圆括号:

  // 省略圆括号
  button.setOnClickListener{ toast("Lambdas") }

定义一个多个参数的方法:

    fun setLambdas(p0 : Int, view : (View)->Unit){}
    // 正常调用(最后一个参数是函数,所以可以将大括号挪出圆括号外面)
    setLambdas(0){view -> Unit}
    // 调用时,最后一个参数View 没有使用
    setLambdas(0){}
上一篇下一篇

猜你喜欢

热点阅读