函数类型、lambda表达式

2020-09-08  本文已影响0人  lqhunter

一、函数类型

//样式
(参数列表类型) -> 返回值类型

//比如,定义一个函数类型的变量
val sum: (Int) -> Int

//方法中定义 函数类型参数
fun test(age: Int, action: (Int) -> String) {}

如需将函数类型指定为可空,使用圆括号:((Int, Int) -> Int)?

函数类型可以使用圆括号进行接合:(Int) -> ((Int) -> Unit)

箭头表示法是右结合的,(Int) -> (Int) -> Unit 与前述示例等价,但不等于 ((Int) -> (Int)) -> Unit

二、函数类型实例化

//1.lambda表达式
val sum = { a: Int, b: Int -> a + b }

//2.匿名函数
val sum1 = fun(a: Int, b: Int) { a + b }

//3.双冒号,函数引用
fun sumab(a: Int, b: Int): Int {
    return a + b
}

val sum2 = ::sumab

三、lambda表达式

1.基本形式
组成结构
//例如调用上面方法,传入lambda表达式,内部会 自动创建对应的对象
test(12, { it -> "aa" })
2.基本使用
//方法中定义,需要传入 函数类型 的参数
fun test(age: Int, action: (Int) -> String) {
    val result = action(age)
    println(result)
}

//使用此方法
test(12, { it -> "aa" })

3.语法简化
login.setOnClickListener({ v: View ->
    //doSomething
})

//如果Lambda为最后一个参数,可以放到括号外面
login.setOnClickListener() { v: View ->
    //doSomething
}

//lambda是setOnClickListener 单参数,括号省略
login.setOnClickListener { v: View ->
    //doSomething
}

//lambda表达式中参数只有一个,参数省略,如果需要使用,it代替
login.setOnClickListener {
    //doSomething
}

四、匿名函数

//赋值给变量
val add = fun(a: Int, b: Int): Int { return a + b }

val multiply = fun(a: Int, b: Int): Int { return a * b }

fun calculate(action: (Int, Int) -> Int): Int {
    val a = 1
    val b = 2
    return action(a, b)
}

fun main() {

    println(calculate(add))

    println(calculate(multiply))


}

或者直接在参数里创建一个 匿名函数

calculate(fun(a: Int, b: Int): Int { return a + b })

1

五、函数引用

//定义一个普通函数/方法
fun cc(a: Int, b: Int): Int {
    return a + b
}


fun main() {

    //用双冒号创建一个函数类型的对象
    val ccInstance = ::cc

    cc(1, 2) //直接调用函数
    ccInstance(1,2) //用赋值的变量调用
    (::cc)(1, 2) //对象 ::cc 调用,和上面等价

}

对于有相同变量名的重载方法,需要显示指明变量的函数类型才行

fun cc(a: Int, b: Int): Int {
    return a + b
}

fun cc(a: Int, b: Int, c:Int): Int {
    return a + b + c
}

fun main() {
    //显示指明变量具体的函数类型
    val ccInstance1 : (Int, Int) -> Int = ::cc
    val ccInstance2 : (Int, Int, Int) -> Int = ::cc
}
上一篇下一篇

猜你喜欢

热点阅读