一、函数的定义

  • 格式:
    关键字(fun) 函数名(参数列表): 返回值类型{
    // 函数体
    }
  • 示例:
    fun main(args: Array<String>): Unit {// Unit等价于Java中的void,函数返回值为Unit可省略
        println(args.contentToString)
    }
    

二、函数 vs 方法

  • 方法可以认为是函数的一种特殊类型
  • 从形式上,有receiver(接收者)的函数即为方法
        @JvmStatic
        fun main(vararg args: String) {
            val foo: Foo = Foo();
            foo.bar("helloKotlin", 0L) // foo就是上文所述的receiver
        }
    
        class Foo {
            fun bar(p0: String, p1: Long): Any {
                println("The first param is $p0")
                return p1
            }
        }
    

注:其实所谓的方法就是外面套了一个类,它的receiver就是外面套的类的实例。


三、函数的类型

函数 返回值类型
fun foo(){ } () -> Unit
fun foo(p0: Int): String {...} (Int) -> String
class Foo { fun bar(p0: String, p1:Long): Any {...} } Foo.(String, Long) -> Any

四、函数的引用

  • 函数的引用类似于C语言中的函数指针,可以用于函数传递
    fun foo() {}// 定义函数
    ::foo// 函数引用
    val f: () -> Unit = ::foo// 定义变量接收引用
    
    fun foo(p0: Int): String {...}
    ::foo
    val g: (Int) -> String = ::foo
    
    // 带有receiver的函数引用
    class Foo {
        fun bar(p0: String,p1: Long): Any {...}
    }
    Foo::bar
    val h: (Foo, String, Long) -> Any = Foo::bar
    
    val foo = Foo()
    val m: (String, Long) -> Any = foo::bar // 绑定receiver的函数引用
    

五、变长参数

变长参数就是指我们在调用一个函数的时候可以根据情况传入不同数量的参数,个数在调用之前是不确定的,在调用的时候长度、类型都是确定的。

  • java中的变长参数:

    public static void main(String[] args) {
    //
    }
    
  • kotlin中的变长参数:

    fun main(args: Array<String>) {
    //
    }
    

六、多返回值

多返回值返回值的个数是确定的,但是是多个。

  • kotlin中的多返回值
    fun multiReturnValues(): Triple<Int, Long, Double> {
        return Triple(3, 4L, 5.0);
    }
    
    val (a, b, c) = multiReturnValues()
    

七、默认参数

  • 函数的定义:

        /**
        * 默认参数
        */
        fun defaultParameter(x: Int, y: String, z: Long = 0L) {
            println("defaultParameter")
        }
    
  • 函数的使用

        // 默认参数
        defaultParameter(1, "test")
    

八、具名参数

    /**
     * 默认参数
     */
    fun defaultParameter(x: Int = 5, y: String, z: Long = 0L) {
        println("defaultParameter")
    }

    // 具名参数--形参y来显示接收参数
    defaultParameter(y = "HelloX")