【2023】Kotlin教程 第二篇 面向对象与函数式编程 第13章 函数式编程基石——高阶函数和Lambda表达式 13.2 高阶函数 13.2.2 函数字面量

【2023】Kotlin教程

在这里插入图片描述

第二篇 面向对象与函数式编程

第13章 函数式编程基石——高阶函数和Lambda表达式

函数式编程思想虽然与面向对象一样立即悠久,但是支持函数式编程的计算机语言不过是近几年的事情。这些语言有Swift、Python、Java 8和C++ 11等,作为新生的语言Kotlin也支持函数式编程。

13.2 高阶函数

函数式编程的关键是高阶函数的支持。一个函数可以作为另一个函数的参数,或者返回值,那么这个函数就是“高阶函数”。

13.2.2 函数字面量

函数类型可以声明的变量,那么函数类型变量能够接收什么的数据呢?即函数字面量如何表示的问题,函数字面量可以有三种表示:

  • 函数引用。引用到一个已经定义好的,有名字的函数。它可以作为函数字面量。
  • 匿名函数。没有名字的函数,即匿名函数,它也可以作为函数字面量。
  • Lambda:表达式。Lambda表达式是一种匿名函数,可以作为函数字面量。

举个栗子:

fun calculate(opr: Char): (Int, Int) -> Int {
    
    

    // 加法函数
    fun add(a: Int, b: Int): Int {
    
    
        return a + b
    }

    // 减法函数
    fun sub(a: Int, b: Int): Int {
    
    
        return a - b
    }

    val result: (Int, Int) -> (Int) =
        when (opr) {
    
    
            '+' -> ::add
            '-' -> ::sub
            '*' -> {
    
    
                // 乘法匿名函数
                fun(a: Int, b: Int): Int {
    
    
                    return (a * b)
                }
            }

            else -> {
    
     a, b -> (a / b) } // 触发Lambda 表达式
        }
    return result
}

fun main() {
    
    

    val f1 = calculate('+')
    val f2 = calculate('-')
    val f3 = calculate('*')
    val f4 = calculate('/')

    println(f1(10, 5))
    println(f2(10, 5))
    println(f3(10, 5))
    println(f4(10, 5))

}

这段代码中,'+' -> ::add'-' -> ::sub 是函数引用,

上述代码 '+' -> ::add'-' -> ::sub 是函数引用, 采用“双冒号加函数名”形式引用,add和sub是两个局
部函数,它们的函数引用表示方式是:add和:sub,它们可以作为函数字面量赋值给result变量。

代码fun(a: Int, b: Int): Int { return (a * b) }声明匿名函数,匿名函数不需要函数名,它是一个表达式直接赋值给result变量。

代码{ a, b -> (a / b) }采用的Lambda表达式,也可以赋值给result变量。

获得一个函数类型的变量之后如何使用呢?答案是可以把它当作函数一样调用

猜你喜欢

转载自blog.csdn.net/weixin_44226181/article/details/130024446