kotlin 高阶函数尝鲜

所谓高阶函数,就是参数或者返回值是函数的函数。在python里也称为偏函数。

刚好看到kotlin的高阶函数部分,就记录一下。

示例代码很少,先放代码:

package com.example.code

import kotlin.math.pow


val add = { a: Int, b: Int -> a + b }
val del = { a: Int, b: Int -> a - b }
val mul = { a: Int, b: Int -> a * b }
val div = { a: Int, b: Int -> a / b }

fun inc(x: Int, y: Int) = x + y + 1

fun operate(n: Int, m: Int, op: (Int, Int) -> Int) = op(n, m)

fun returnOp(from: String = ""): (Int, Int) -> Int {
    return when (from) {
        "add" -> add
        "del" -> del
        "mul" -> { x, y -> x * y }
        "div" -> { x, y -> x / y }
        else -> { x: Int, y: Int -> x.toDouble().pow(y.toDouble()).toInt() }
    }
}

fun main() {
    println(operate(1, 2, add))
    println(operate(1, 2, del))
    println(operate(1, 2, mul))
    println(operate(1, 2, div))
    println(operate(1, 2, ::inc))

    println("HIGH: ${returnOp("add")(3, 4)}")
    println("HIGH: ${returnOp("-")(3, 4)}")
}

这里分别定义了两种简单的高阶函数,第一种是参数是函数的函数;第二种是返回值是函数的函数。

  • 第一种对应的示例代码就是 fun operate(n: Int, m: Int, op: (Int, Int) -> Int) = op(n, m);
  • 第二种对应的示例代码就是 fun returnOp(from: String = ""): (Int, Int) -> Int {...};
    至于上面的 add/del/div/mulkotlin里面叫 lambda表达式。不过这个并不是高阶函数,只是lambda表达式。(lambda表达式约等于匿名函数,不一定就是高阶函数。)

所谓lambda表达式,就是”A lambda is an expression that makes a function.“

上面说的声明,高阶函数的声明,下面看一下高阶函数的调用:

  • println(operate(1, 2, div)) 这个很简单,理解起来也不会有任何的障碍。这种参数是函数类型的高阶函数,调用起来和普通函数差别不大,几乎没有差别。

  • println("HIGH: ${returnOp("add")(3, 4)}") 这种返回值类型是函数类型的高阶函数的调用,看起来有点碍眼了。因为它的形式是symbol(xx)(yy).后面有两个括号了。
    但是还是比较好理解的,因为第一个括号是为了得到这个返回值,跟普通函数是一样的。然后第二个括号是因为这个返回值它是个函数,然后既然是个函数,那就能调用,那调用这个函数就得有括号,即使是无参函数。

当然,如果第二种调用分两步去写,就更容易理解一点了。

val delete = returnOp("del")
println("HIGH: ${delete(3, 4)}")

得益于kotlin 是静态类型的语言,所以其高阶函数的调用写起来很容易,ide 的提示功能很强大。

OK,以上是kotlin中高阶函数的尝鲜。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值