轻轻松松入门Kotlin(二)

90 阅读2分钟

可以毫不夸张地说,在Kotlin的世界里,函数是第一公民,这些函数的特性大大简化了我们编写业务逻辑的代码量。

高阶函数

高阶函数就是可以接受函数作为参数或者返回一个函数的函数。 传递无参函数:

fun main(args: Array<String>) {
    say({ speak() })
    say { speak() }//当只有一个函数作为参数的时候,可以省略小括号
​
}
//say() 函数的参数为一个函数,它的名字是:greet,返回值为Unit,无参数
fun say(greet: () -> Unit) {
    greet()
}
​
fun speak() {
    println("Hello world")
}

结果是:

Hello world
Hello world

这里的() -> Unit表示的是一个函数类型。

传递有参函数:

fun max(collection: Collection<Int>, less: (Int, Int) -> Boolean): Int? {
    var max: Int? = null
    for (it in collection)
        if (max == null || less(it,max!!))
            max = it
    return max
}
​
fun compare(a: Int, b: Int): Boolean = a > b
​

调用:

println(max(arrayListOf(1, 2, 3, 4), ::compare))
​

或者直接传入一个Lambda表达式的字面函数

println( max(arrayListOf(1,2,3,4),{ a, b -> a > b }))

结果是:

4

需要说明的是: Kotlin 中::表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个函数。

函数声明

fun fun_name(name: type, ...) : return_type {

some expressions

}

kotlin中使用fun关键字表示一个函数。和java不同的是,函数中的参数使用name:type形式声明。 函数的返回类型在函数的)后面声明。

一个简单实例:

fun double(x: Int): Int {
    return 2*x
}
​

命名参数的函数声明

    fun newPeople(name: String, age: Int = 2) : People {
        return People(name, age)
    }
​

调用方式

    val lilei= newPeople(name = "Lilei")
    val lily = newPeople("lily")
    val lucy = newPeople("lucy", 23)
    val hanmeimei = newPeople(name ="hanmeimei", age = 15)
​
    println("lilei: name = ${lilei.name}, age = ${lilei.age}")
    println("lily: name = ${lily.name}, age = ${lily.age}")
    println("lucy: name = ${lucy.name}, age = ${lucy.age}")
    println("hanmeimei: name = ${hanmeimei.name}, age = ${hanmeimei.age}")
​

结果:

函数返回值

Kotlin中通过在函数的)后面加上: return_type来表示该函数有返回值。

例如:

fun newPeople(name: String, age: Int = 2) : People {
    return People(name, age)
}
​

表示改函数将返回一个People类型的返回值

  1. 返回Unit类型

    Unit类型类似于java中的Void类型

    fun showMessage(message: String): Unit {
        println("message is $message")
        return
    }    
    ​
    ​
    

    结果

    I/System.out: message is test
    ​
    ​
    

    当然此时由于Unit没有任何意义,所以上面的函数又可以写成这样

    fun showMessage(message: String): Unit {
        println("message is $message")
    }        
    ​
    

    或者

    fun showMessage(message: String){
        println("message is $message")
    }        
    ​
    

可变参数

kotlin中函数的可变参数通过vararg关键词来修饰