Kotlin笔记(三)——函数

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值