Kotlin语言(十):函数式编程

1、闭包

闭包:函数式编程,函数可以作为方法的返回值,也可以作为方法的参数,lambda表达式

fun test(): () -> Unit {
    var a = 10

    // 此处方法的返回值就是闭包
    return {
        println(a)
        a++
    }
}

fun main() {
    val result = test()
    result()         // 10
    result()         // 11
    result.invoke()  // 12
}

2、高阶函数

/**
 * 普通函数
 */
fun add(a: Int, b: Int): Int {
    return a + b
}

/**
 * 普通函数
 */
fun sub(a: Int, b: Int): Int {
    return a - b
}

/**
 * 高阶函数
 * 需要两个 Int 参数和一个函数类型的参数
 */
fun cecl(a: Int, b: Int, block: (Int, Int) -> Int): Int {
    //return block(a, b)
    return block.invoke(a, b)
}

fun main() {
    val a = 10
    val b = 20
    var sum = add(a, b)
    var result = sub(a, b)
    println(sum)    // 30
    println(result) // -10

    // :: 表示函数的引用,类似于C/C++里的函数指针
    sum = cecl(a, b, ::add)
    println(sum)    // 30
    result = cecl(a, b, ::sub)
    println(result) // -10
}

3、lambda表达式

/**
 * 高阶函数
 * 需要两个 Int 参数和一个函数类型的参数
 */
fun lambda(a: Int, b: Int, block: (Int, Int) -> Int): Int {
    //return block(a, b)
    return block.invoke(a, b)
}

fun lambda2(a: Int, block: (Int, Int) -> Int, b: Int): Int {
    //return block(a, b)
    return block.invoke(a, b)
}

fun main() {
    val a = 10
    val b = 20


    // 1、匿名函数即 lambda 表达式
    val sum = lambda(a, b, { m, n ->
        m + n
    })
    println(sum)    // 30


    // 2、lambda 表达式去括号:当函数最后一个参数为 lambda 表达式时,可以放到括号外面ß
    val result = lambda(a, b) { m, n ->
        m - n
    }
    println(result) // -10

    val l3 = lambda2(a, { m, n ->
        m + n
    }, b)
    println(l3);


    // 3、无参 lambda 表达式
    {
        println("无参 lambda 表达式")
    }();

    {
        println("无参 lambda 表达式")
    }.invoke()


    // 4、有参 lambda 表达式
    val r1 = { a: Int, b: Int ->
        println("有参 lambda 表达式")
        a + b
    }(10, 20)
    println(r1) // 30

    val r2 = { a: Int, b: Int ->
        println("有参 lambda 表达式")
        a - b
    }?.invoke(10, 20)
    println(r2) // -10
}

你可能感兴趣的:(Kotlin语言(十):函数式编程)