函数 - 图1
kotlin 函数:可以赋值、传递,并在合适的条件下调用

函数定义

函数 - 图2

  1. fun main(vararg args:Array<String>):Unit{
  2. }

补充:vararg 变长参数 相当于java String… args

函数 Funciton 与 方法 Method

  • 方法是函数一种特殊类型
  • 从形式上,有 receiver 的函数即是方法。(比如 对象里面的 getXXX)
  1. fun function() {
  2. //顶级函数,不在任何 class 内
  3. }
  4. class Method {
  5. fun getName() {
  6. //必须通过对象.getName调用方法
  7. }
  8. }

函数类型

函数 - 图3

  1. fun call() {
  2. var f:()->Unit = ::function
  3. var f2:(String)->Unit= ::function2
  4. val kFunction1:(Method)->Unit = Method::getName
  5. }
  6. fun function() {
  7. //顶级函数,不在任何 class 内"
  8. }
  9. fun function2(str: String) {
  10. //顶级函数,不在任何 class 内"
  11. }
  12. class Method {
  13. fun getName() {
  14. //必须通过对象.getName调用方法
  15. }
  16. }

函数的类型 = (参数类型1,参数类型2,…) -> 返回参数类型
如果是包含receiver ,如上述代码kFunction1 函数的类型= (Receiver,参数类型…) -> 返回参数类型

函数的引用

函数 - 图4

  1. fun call() {
  2. var f = ::function
  3. var f2 = ::function2
  4. val kFunction1 = Method::getName
  5. }
  6. fun function() {
  7. //顶级函数,不在任何 class 内"
  8. }
  9. fun function2(str: String) {
  10. //顶级函数,不在任何 class 内"
  11. }
  12. class Method {
  13. fun getName() {
  14. //必须通过对象.getName调用方法
  15. }
  16. }

把函数作为参数传递

fun call() {
    val fooGetName: (Foo, String) -> Unit = Foo::getValue
    val fooGetName2: Foo.(String) -> Unit = Foo::getValue
    doWithFoo(fooGetName)
}

fun doWithFoo(fooGetName: (Foo, String) -> Unit) {
    fooGetName.invoke(Foo(), "hello")
}

注:fooGetName2 类型另外一种写法

vararg 变长参数

fun multiParameter(vararg array: Int) {
    for (i in array) {
        println(i)
    }
}

这里的参数 array 类型实际是 IntArray

multiParameter(1, 5, 6, 77)

补充知识点:listOf 和 arrayOf 都使用了 vararg 实现

public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
public inline fun <reified @PureReifiable T> arrayOf(vararg elements: T): Array<T>

返回多个参数

fun returnMoreParameter():Triple<String,Double,Boolean>{
    return Triple("july",100.0,true)
}

注:返回两个参数使用 Pair

   val(x,y,z)= returnMoreParameter();
    println("$x   $y   $z") //july   100.0   true

解构 x,y,z 分别对应三个返回参数

默认参数

fun defaultParameter(x: String="", y: Int, z: Boolean=true) {

}
defaultParameter( "abc",1)

这里调用时 z 没有传值,且z 默认赋值为true ,那 x 能不传吗?

函数 - 图5
不行,编译器无法判断当前要赋值到那个参数 :::danger 注:最后一个参数才能省略(且参数有默认值) :::

具名参数

    defaultParameter( "abc",1)
    defaultParameter( y=1,x="abc")//具名参数

fun defaultParameter(x: String="", y: Int, z: Boolean=false) {

}

具名参数可以不按照函数参数顺序传值