可以毫不夸张地说,在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类型的返回值
-
返回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关键词来修饰