Kotlin函数式编程

2022-11-15 21:19:27 浏览数 (1)

Lambda表达式

Lambda表达式本质就是匿名函数,它的出现减少了代码量,同时也使代码变得更加简洁明了。Lambda是函数式编程的基础。

Lambda语法

在Kotlin中,Lambda表达式语法格式如下

代码语言:javascript复制
// 1.无参数
val 函数名 = { 函数体 }

// 2.有参数
val 函数名: (参数1类型, 参数2类型, ...) -> 返回值类型 = {参数1, 参数2, ... -> 函数体 }
// 表达式返回值类型可根据代码自动推导,所以等价于
val 函数名 = {参数1: 类型1, 参数2: 类型2, ... -> 函数体}

// 3.匿名函数
val 函数名 = fun(参数1: 类型1, 参数2: 类型2, ...): 返回值类型 {
    函数体
}

注:Lambda的函数体是可以多行的,返回的是函数体最后一行的返回值。这是因为Kotlin是表达式语法,而不同于Java的声明式语法,Java的表达式是没有返回值的,在Kotlin中任何一句表达式都有返回值。

Lambda表达式具体实例如下

  • 无参数
代码语言:javascript复制
val say = { println("hello") }

// 相当于
fun say() {
    println("hello")
}
  • 有参数
代码语言:javascript复制
val sum: (Int, Int) -> Int = {a, b -> a   b}
// 等价于
val sum = {a: Int, b: Int -> a   b}

// 相当于
fun sum(a: Int, b: Int): Int {
    return a   b
}
  • 匿名函数
代码语言:javascript复制
val sum = fun(a: Int, b: Int): Int {
       return a   b
}

// 相当于
fun sum(a: Int, b: Int): Int {
    return a   b
}

高阶函数

高阶函数是指将函数作为函数的参数或返回值。

先以一个简单的例子引出

代码语言:javascript复制
fun main() {
    val res = calc(5, 3, ::sum)
    println("res = $res")
    // 输出结果: res = 8
}

fun calc(a: Int, b: Int, f: (a: Int, b: Int) -> Int): Int {
    return f(a, b)
}

fun sum(a: Int, b: Int): Int {
    return a   b
}

可以看出上面代码中,定义了一个calc函数,它最后一个参数f: (a: Int, b: Int) -> Int表示接受一个函数引用,函数体内调用了最后一个参数指向的函数。随后定义了sum函数,该函数类型符合calc函数第三个参数。::sum表示sum函数的引用,calc(5, 3, ::sum)这一句就相当于执行了sum(5, 3),所以输出结果为8

然后用Lambda表达式改写sum函数

代码语言:javascript复制
fun main() {
    val sum = {a: Int, b: Int -> a   b}
    val res = calc(5, 3, sum)
    println("res = $res")
    // 输出结果: res = 8
}

fun calc(a: Int, b: Int, f: (a: Int, b: Int) -> Int): Int {
    return f(a, b)
}

直接定义了一个Lambda表达式,赋值给了sum,直接将sum传入calc函数,同样输出了8。

接着直接将Lambda定义在函数调用的参数列表中

代码语言:javascript复制
fun main() {
    val res = calc(5, 3, {a: Int, b: Int -> a   b})
    println("res = $res")
    // 输出结果: res = 8
}

fun calc(a: Int, b: Int, f: (a: Int, b: Int) -> Int): Int {
    return f(a, b)
}

在Kotlin中调用高阶函数时,如果最后一个参数为Lambda表达式时,可以将函数调用的括号前移

代码语言:javascript复制
val res = calc(5, 3, {a: Int, b: Int -> a   b})
// 等价于
val res = calc(5, 3) {a: Int, b: Int -> a   b}

特别地,当高阶函数只有有一个参数时,前移的括号还可以省略

代码语言:javascript复制
fun main() {
    show({ println("hello") })
    // 等价于(括号前移)
    show() {
        println("hello")
    }
    // 等价于(省略前移的括号)
    show {
        println("hello")
    }

    // 输出结果: hello
}

fun show(f: () -> Unit) {   // Unit相当于其他编程语言的void类型
    f()
}

其他更深入内容请等笔者补充 ~~~ (又开始偷懒了QAQ)

本文作者: Ifan Tsai  (菜菜)

本文链接: https://cloud.tencent.com/developer/article/2164581

版权声明: 本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!

0 人点赞