今天继续讨论kotlin的函数。
上一篇讲到,变长函数,有一个问题如果想要往变长函数中vararg参数传的参数过多,能不能直接传一个数组呢?答案是肯定的,只须在数组前加*。例如:
val size = asNub(1,2,*arr,3)
kotlin的函数是可以在文件顶级声明的,这意味着函数并不需要像在java中一样必须依附于类,顶级函数可以作用于不同的包。
kotlin支持局部函数,说明白点就是函数嵌套。官方给出的例子:
fun reachable(from:Vertex, to:Vertex):Boolean{
val visited = HashSet<Vertex>()
fun dfs(current: Vertex) {
if (current == to) return@reachable true//返回外层函数@就可以
if (!visited.add(current))return
for(v in current.neighbors)
dfs(v)
}
dfs(from)
return false
}
如果函数中有泛型参数,则声明时在函数名前加<T>
尾递归函数,kotlin支持函数尾递归,其实质是循环,而不是递归,这避免了递归可能出现的栈溢出的问题,在定义时使用 tailrec,编译器会优化递归,并用高效迅速的循环代替它。
看例子:
tailrec fun findFixPoint(x:Double=1.0):Double=
if (x == Math.cos(x)) x else findFixPoint(Math.cos(x))
高阶函数,就是参数可以为函数的函数,例如:
fun <T> addFun(list : List,f : ( T , T ) -> T) : T?{
var x:T? = null
list.add(f(test1,test2))
return list
}
第二个参数是一个有两个参数的函数,返回值为T类型。
kotlin还可以使用字面函数,如a.length>b.length
字面函数可以访问闭包。闭包,即访问自身范围外的声明的量
关于kotlin的函数,还有一些内容没有讲到,主要是因为和java的语法差不多。但是还有很多细节,本人没有考虑到,后期在学习kotlin的项目时,还会再加以巩固。