详解Kotlin 高阶函数 与 Lambda 表达式
详解Kotlin高阶函数与Lambda表达式
高阶函数(higher-orderfunction)是一种特殊的函数,它接受函数作为参数,或者返回一个函数.这种函数的一个很好的例子就是lock()函数,它的参数是一个锁对象(lockobject),以及另一个函数,它首先获取锁,运行对象函数,然后再释放锁:
funlock(lock:Lock,body:()->T):T{ lock.lock() try{ returnbody() }finally{ lock.unlock() } }
上面的代码:body参数是一个函数类型:()->T,因此它应该是一个函数,这个函数没有参数,返回一个T类型的值。
高阶函数类似C语言的函数指针,高阶函数另一个例子:
funList .map(transform:(T)->R):List { valresult=arrayListOf () for(iteminthis) result.add(transform(item)) returnresult } valdoubled=ints.map{it->it*2}//调用
函数类型(FunctionType)
对于接受另一个函数作为自己参数的函数,我们必须针对这个参数指定一个函数类型,例如前面例子的map函数,参数transform的类型是(T)->R,意思是它是一个函数,参数T,返回R。
引用以及返回一个函数
高阶函数可以接受函数参数,也可以返回一个函数引用,函数可以赋值给变量,和C语言的函数指针一样。
funbar():(String)->String={str->str.reversed()} valreversi=bar() reversi("hello") reversi("world")
内联函数(InlineFunction)
Kotlin支持内联函数,函数内联也许会导致编译产生的代码尺寸变大,但如果我们使用合理(不要内联太大的函数),可以换来性能的提高。
inlinefunfoo(){ // }
如果一个内联函数的参数中有多个Lambda表达式,而你只希望内联其中的一部分,你可以对函数的一部分参数添加noinline标记。
inlinefunfoo(inlined:()->Unit,noinlinenotInlined:()->Unit){ //... }
Lambda表达式
Lambda表达式的完整语法形式,如:
valsum={x:Int,y:Int->x+y}
Lambda表达式包含在大括号之内,在完整语法形式中,参数声明在圆括号之内,参数类型的声明可选,函数体在->符号之后.如果Lambda表达式自动推断的返回值类型不是Unit,那么Lambda表达式函数体中,最后一条(或者就是唯一一条)表达式的值,会被当作整个Lambda表达式的返回值。
很多情况下Lambda表达式只有唯一一个参数.如果Kotlin能够自行判断出Lambda表达式的参数定义,那么它将允许我们省略唯一一个参数的定义,并且会为我们隐含地定义这个参数,使用的参数名为it:
ints.filter{it>0}
使用带标签限定的return语法,我们可以在Lambda表达式内明确地返回一个结果值.否则,会隐含地返回Lambda表达式内最后一条表达式的值。
ints.filter{ valshouldFilter=it>0 return@filtershouldFilter }
匿名函数(AnonymousFunction)
匿名函数看起来与通常的函数声明很类似,区别在于省略了函数名。
fun(x:Int,y:Int):Int=x+y
参数和返回值类型的声明与通常的函数一样,但如果参数类型可以通过上下文推断得到,那么类型声明可以省略:
ints.filter(fun(item)=item>0)
闭包
所谓闭包,就是一个代码块可以访问外层作用域的变量和参数,例如上面提到的Lambda表达式和匿名函数。
varcontainsNegative=false valints=listOf(0,1,2,3,4,5) ints.forEach{ if(it<0) containsNegative=true }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!