Kotlin语法学习之Lambda

1.Lambda介绍

Lambda表达式可以减少代码的复杂度,使代码看上去更加清爽,另外,Kotlin中有许多高阶函数,这些函数基本都是由Lambda表达式实现的,因此,学习Lambda表达式是十分有必要的。

Kotlin中的Lambda表达式本质上底层是匿名函数实现的。

2.Lambda语法

2.1 表达式特点

  • Lambda总是被{}包裹;
  • 若有参数,则在->左侧;
  • 若有函数体,则在->右侧。

2.2 语法

2.2.1 无参数

语法:

// 语法
val/var 函数名 = {
    //逻辑操作
}

示例:

// 普通
fun t1() {
    println("我是普通表达式")
}

// 无参Lambda
var tt1() = {
    println("我是无参Lambda表达式")
}

2.2.2 有参

语法:

// 语法1
val/var 函数名: (参数类型, 参数类型 ...) -> 返回值类型 = {
    //逻辑操作
}

// 语法2
val/var 函数名 = {
    变量名: 变量类型, 变量名:变量类型, ... -> 逻辑操作
}

示例:

// 普通
fun t2(a: Int, b: Int): Int {
    return a + b
}

// Lambda表达式1
var tt2: (Int, Int) -> Int = {
    a, b -> a + b
}

// Lambda表达式2
var ttt2 = {
    a:Int, b: Int -> a + b
}

2.2.3 做为函数中的参数

语法:

// 语法
fun 函数名(变量名: 变量类型, ... , 函数名: (变量名: 变量类型 ...) -> 返回值): 返回值 {
    //逻辑
}

示例:

// 普通
fun sum(a: Int, b: Int): Int {
    return a + b;
}
fun t3(a: Int, b: Int): Int {
    return a + b
}
t3(4, sum(5,6))

// Lambda表达式作为函数中的参数
fun tt3(a: Int, sum: (num: Int, num2: Int) -> Int): Int {
    return a + sum.invoke(5,6);
}
tt3(4, {num: Int, num2: Int -> num + num2})

说明:

做为函数中的参数比较难理解,可以把它认为是将普通函数中的某一个参数变成一个函数,这个函数即是Lambda形式的函数,很多高阶函数即是通过此方法来实现的。

3.Lambda表达式使用

3.1 it

当lambda表达式函数中的参数只有1个的时候,可以用it来代替。

fun tt4(a: Int, foo: (num: Int) -> Boolean ): Int {
    if(foo(a)) {
        return a
    } else {
        return 0
    }
}

tt4(10, { it > 5}) // 输出10
tt4(3, { it > 5}) //输出0

等价于:

tt4(10, { num:Int -> num > 5 })

3.2 模拟为AndroidView编写一个OnClickListener

模拟一个View

class View {
    
    // listener实际上是一个 函数
    var mListener: ((s: String) -> Unit)? = null
    
    fun setOnClickListener( listener: ((s: String) -> Unit)?) {
        this.mListener = listener
    }
    
    fun click(s: String) {
        mListener?.invoke(s)
    }
}

设置点击监听,并点击:

var v = View();

v.setOnClickListener { println("I want Say: $it") }

v.click("Hello Kotlin")  // 输出:I want Say: Hello Kotlin

3.3 未完待续 。。。

推荐阅读更多精彩内容