Kotlin函数之fun?function?

在Kotlin中申明一个函数要使用fun关键字,至于为啥用fun这个缩写也没啥奇怪的,可能是JB家创造这门语言的人喜欢……好吧好吧,fun就fun,你喜欢就好

其实不管是fun还是function,我们在ide中敲代码,这些关键字都是有提示的,例如在intellij idea中,在合适的位置敲一个f就会有fun的提示。

函数申明:

先看看如何申明一个最基本的函数,求两个Int之和

fun add(num1: Int,num2: Int): Int{
return num1 + num2
}
var result: Int = add(1,1)//函数调用

无返回值的函数,返回类型其实是Unit,此时返回类型是可以省略的

//此时返回类型可以省略
fun testFun():Unit{
    print("======")
}

如果函数体是单个的表达式,就可以简化函数的定义,具体来书就是不要大括号了,直接在返回类型后面 “= 表达式”

fun addNum(num1: Int,num2: Int): Int = num1 + num2//单条普通语句
fun maxNum(num1: Int,num2: Int): Int = if (num1 > num2) num1 else num2//if表达式
fun getScroeLevel(scroe: Int): String = when{//when表达式
        scroe == 100 -> "very good!"
        scroe >= 80 -> "good!"
        scroe >= 60 -> "passed!"
        else -> "bad"
    }

函数参数:

现在函数可以有默认值了,这在一定程度上可以减少函数重载

//第二个参数使用默认实参
fun add(num1: Int,num2: Int = 10): Int{
    return num1 + num2
}

再看一个默认参数在继承结构中的规则

open class Base{
    open fun test(id: Int = 10){

    }
}

class Dev : Base(){
    //重写父类中带有默认参数的方法时不允许再有默认参数,其默认值默认是父类中的默认参数
    override fun test(id: Int) {
        print("$id")
    }
}

fun main(args: Array<String>) {
    Dev().test()//输出10
}

命名参数的使用,在默认参数很多的情况下,如果只想改变其中的某一个默认参数时,这个语法很有用(但是Kotlin调用Java写的方法是不能使用)

class User {
    fun setUserInfo(id: Int,
                    name: String,
                    param1: Boolean = true,
                    param2: Boolean = false,
                    param3: Boolean = true,
                    param4: Boolean = false) {
        //TODO
    }
}

fun main(args: Array<String>) {
    var user: User = User()
    //次数我只想改变param4
    user.setUserInfo(1, "liuliqianxiao", true, false, true, true)//传统写法
    user.setUserInfo(1, "liuliqianxiao", param4 = true)//使用命名参数的写法
}

返回类型推导:

如果函数使用表达式的方式定义的,则函数返回类型是自动推导的,也就是可以省略的,但是如果是用大括号来定义的函数体,则必须返回值不能自动推导。

//虽然函数体是一个很简单的表达式,但是返回类型也必须明确标识出来,除非是要返回Unit,否则不能省略
fun addNum(num1: Int, num2: Int): Int {
    return num1 + num2
}

fun addNum1(num1: Int, num2: Int) = num1 + num2//使用函数表达式的方式返回类型是可以自动推导出来滴

函数基础篇就写到这里咯,下一篇准备讲讲函数方面稍微高级一点的语法

原文地址:https://www.cnblogs.com/liuliqianxiao/p/7142662.html