本文为大家介绍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的函数的一些内容,希望能够帮到大家。