本文为大家介绍Kotlin的函数,在Kotlin的第一篇文章中,我们已经看到过Kotlin最基本的函数使用,但是Kotlin的函数拥有更多的“魔法”,本文介绍其他函数相关的内容。至于函数作为类中的方法使用,我们会在介绍类的时候再做介绍,下面进入主题。
函数只有一句表达式,例如
fun oneExpression() {
println("一句表达式函数")
}
Kotlin有更简单的定义方法:
fun oneExpressionEasy() = println("简单的一句表达式函数")
两个函数的效果是一样的,但是第二个更简洁。Kotlin还可以定义局部函数:
fun createIntListRange(start: Int, end: Int) : List<Int> {
val list = mutableListOf<Int>()
fun fillInIntList() {
for (num in start..end) {
list.add(num)
}
}
fillInIntList()
return list
}
局部函数可以访问外部函数中的局部变量,比如上例中的list,在上面的例子中,我们将生成list中元素的步骤封装为一个局部函数。局部函数中使用了for循环,num in start..end遍历从start到end的数字。实际上,容器(List,Map等)操作有更简单的方法,待将来介绍容器相关内容时再做介绍,这里暂且使用for循环进行处理。调用函数
println(createIntListRange(1, 5))
输出为:
[1, 2, 3, 4, 5]
传递参数时可以使用参数名进行赋值,这样不必保证传递参数的顺序,对于参数列表比较长的情况尤其适用,例如
println(createIntListRange(end=5, start=1))
函数的参数还可以指明默认值,例如上面的函数定义,我们的函数头可以这样写:
fun createIntListRange(start: Int=1, end: Int=5)
那么,调用时如果没有传递相应的参数,则会使用默认值,例如下面的例子中,我们只赋值了end参数,start参数会使用默认的1
println(createIntListRange(end=5))
Kotlin支持高阶函数,所谓的高阶函数,就是可以把函数当做参数和返回值使用。下面我们会通过一个使用高阶函数的例子,进一步引入Lambda表达式。看一下例子
fun dealWithInt(aInt: Int, dealFunc: (element:Int) -> Int) : Int {
return dealFunc(aInt)
}
dealWithInt函数的第二个参数dealFunc就是一个函数类型,该函数的参数为Int类型,返回值为Int类型,我们会使用dealFunc传入的函数处理aInt参数,然后返回对应的结果。
定义我们的处理函数:
fun dealFunction(element:Int): Int {
return element + 1
}
将传入的整形参数加1后的结果返回,调用:
println(dealWithInt(1, ::dealFunction))
注意,使用::获取dealFunction函数的引用,调用后的输出结果为2,也就是将我们的1加一后的结果输出。
我们已经知道了高阶函数及其使用,但是Kotlin给我们提供了更简单的语法,如果dealFunction函数只使用一次,我们根本没有必要为其定义函数,Kotlin提供了匿名函数的语法
println(dealWithInt(1, fun (element:Int): Int {
return element + 1
}))
匿名函数就是省略了函数名称的函数,只保留了参数列表和返回值类型,我们可以直接作为参数传递给dealWithInt函数。那么,还能更简单吗?当然可以,我们可以使用Lambda表达式
println(dealWithInt(1, {
element ->
element + 1
}))
更加简单了,Lambda的完整语法为:
{
参数1, 参数2... ->
函数体
}
接下来,继续简化,当Lambda表达式只有一个参数的时候,我们可以省略这个参数,Kotlin会提供给我们一个名为it的参数,代表这个唯一的参数
println(dealWithInt(1, { it + 1 }))
现在我们只需要一行就完成上面复杂的工作。最后,如果Lambda作为函数的最后一个参数,我们可以将其放在函数的()外,而当Lambda是函数唯一的参数时,我们甚至于可以将函数后的()去掉(后面inline函数有示例)
println(dealWithInt(1) { it + 1 })
上面我们通过一个例子,展示了高阶函数以及Lambda的妙用,下面还有一个Lambda相关的语法需要说明,当我们有一个Lambda表达式的参数不使用时,我们可以使用_,代表省略这个参数,为了演示这个语法,我们使用上面完整的Lambda表达式的例子
println(dealWithInt(1, {
_ ->
3
}))
这里我们不再对element参数加1,而是直接返回3。
至此,高阶函数基本介绍完毕,最后看一下inline函数,inline函数会在编译时在函数的调用处直接插入inline函数体的内容,而不会进行函数调用,inline函数建议在使用Lambda作为参数的函数中使用。看一个例子
inline fun printString(offerString: () -> String) {
println(offerString())
}
调用
printString { "Hello World" }
以上就是有关Kotlin的函数的一些内容,希望能够帮到大家。