Kotlin基础教程-高阶函数和lambda表达式

高阶函数与 lambda 表达式

何为高阶函数

函数参数为函数的,称为高阶函数。

高阶函数的定义

fun lock<T>(lock: Lock, body: () -> T ) : T {
    lock.lock()
    try {
        return body()
    }
    finally {
        lock.unlock()
    }
}

lock函数的第二个参数是一个函数,该函数无参,返回T类型。

调用该函数

fun toBeSynchroized() = sharedResource.operation()

val result = lock(lock, ::toBeSynchroized)

val result = lock(lock, {
sharedResource.operation() })

第一个调用传递的是一个标准定义的函数,第二个是一个字面函数(一会会介绍什么是字面函数)。

针对第二个调用,我们正常能看到的方式应该是:

lock (lock) {
    sharedResource.operation()
}

因为Kotlin有一个约定,就是如果第二个参数是函数,可以放到括号外面,所以格式从lock(lock,{function})变成了lock(lock){function}

举第二个栗子

map函数

fun <T, R> List<T>.map(transform: (T) -> R):
List<R> {
    val result = arrayListOf<R>()
    for (item in this)
        result.add(transform(item))
    return result
}

正常调用形式应该是map(funtion),但是由于最后一个参数是参数,所以一般见到的形式是map{funtion}:

val doubled = ints.map {it -> it * 2}

其中{it->it*2}是一个字面函数,关于字面函数也有一个神话(约定)就是如果参数只有一个(这里只有it),该参数也可以省略。

ints.map {it * 2}

字面函数

无声明函数,匿名函数。这两个词能概括么?字面函数就是一种函数表达式。

函数类型

fun max<T>(collection: Collection<out T>, less: (T, T) -> Boolean): T? {
    var max: T? = null
    for (it in collection)
        if (max == null || less(max!!, it))
            max = it
    return max
}

max函数的第二个参数是一个函数,参数名less(T,T)->Boolean就是该函数的类型,表示该函数有两个参数,返回的是布尔值。

闭包

何为闭包

var sum = 0

ins filter {it > 0} forEach {
    sum += it
}
print(sum)

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值