Kotlin高阶函数

1. 基础

1.1 lambada

lambada是一个定义即使用的函数。在kotlin中,函数是一种普通的数据类型,如果函数类型作为另一个函数的参数,则称这个函数为高阶函数。如果一个lambada是一个普通函数中的最后一个参数,那么它可以写在参数括号的外面。

现在定义一个参数为String返回值为Int的lambada如下:

var lambada = { i:String ->
    println("lambada calling")
    1
}

它的类型是

(kotlin.String) -> kotlin.Int

箭头左边的是参数,不可以有小括号,多个参数用逗号分隔;箭头右边的是方法体;方法体的最后一行是返回值。

可以看到在上面的例子中,参数是没有用到的,因此可以简写成下面的形式:

var lambada = { ->
    println("lambada calling")
    1
}

进一步的,箭头也可以省略,顺便去掉打印那一行:

var lambada = {1}

这便是一个无参的,永远返回1的lambada,它的类型如下:

() -> kotlin.Int

现在,吧返回值“1”也去掉,表达式"{}"依然是一个lambada函数(而不是一个数组),它的类型是:

() -> kotlin.Unit

当一个函数没有返回值的时候,我们用Unit来表示这个特征,而不是null,大多数时候我们不需要显示地返回Unit,或者生命一个函数的返回值是Unit,编译器会推断它。

2. 举例:列表过滤

Kotlin中的list支持过滤,该函数定义如下

/**
 * Returns a list containing only elements matching the given [predicate].
 * 
 * @sample samples.collections.Collections.Filtering.filter
 */
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
    return filterTo(ArrayList<T>(), predicate)
}

可以这样调用:

val newList = list.filter { i:Int ->
    i%2 != 0
}

可以把filter抽出一个变量这样更加灵活,如下:

var oddFilter = {i:Int ->
    i%2 != 0
}

var bigNumberFilter = {i:Int ->
    i > 5
}

在使用时,可以直接将函数作为变量传入,也可以在filter的lambada表达式中调用它:

var newList = list.filter { oddFilter(it) }
var newList = list.filter(oddFilter)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值