Kotlin学习笔记——基础语法篇之函数

2019-03-29  本文已影响0人  Jingtianer

函数的一般形式

    fun mathodName(/*para list*/) : String/*return value type*/ {
        /*
            function body
        */
    }

与C、C++或java的不同

  1. 如果要重载,在fun前面加override
  2. 如果想让子类重载,要加open关键词(类也一样)
  3. 可以定义全局函数,函数不是必须写在类里
  4. 可以有默认参数,且默认参数不必放在最后几个
    fun TextView.println(str:CharSequence) {
        append("\n${str}")
    }
    fun TextView.print(str:CharSequence) {
        append(str)
    }//这个东西是扩展函数,后面说
    fun func(str:String = "哈哈哈",i:Int, j:Double) {//str的默认参数"哈哈哈"
        val text:TextView = findViewById(R.id.text)
        text.print("$str")
        text.println("$i")
        text.println("$j")
    }
    func(i = 10, j = 20.5)
  1. 可变参数,在参数列表中,参数名称前用vararg(var = varable, arg = 参数)修饰
    fun appendString(tag:String, vararg info:String?) : String {
        var str:String = "${tag}"
        for (item in info) {
            str = "${str}\n${item}"
        }
        return str
    }

Kotlin的特殊函数

泛型函数/内联函数

例子

    fun<T> appendString(tag:String, vararg info:T?) : String {
        var str:String = "${tag}"
        for (item in info) {
            str = "${str}\n${item.toString()}"
        }
        return str
    }

调用方法

    btn.setOnClickListener {
        text.text = appendString<Int>("转化", 1,2,3,4,5,6,7,8,9)
    }

注意

  1. 只有泛型类才拥有成员泛型函数,或者可以把泛型函数作为全局函数
  2. Kotlin是强类型的语言,如果需要即传递Number类继承的类对象,而不继承其他类对象,不能写<Number> 要写成<reified T : Number>,这个写法等价于java的<T extends Number>

简化函数

Kotlin中,函数的定义形式和变量十分相似,这是因为函数也是一种特殊变量,可以对他赋值

例子

    fun factorial(n:Int):Int = if(n <= 1) n else n*factorial(n-1)

尾递归函数

fun之前加上关键字tailrec(tail——尾巴,rec——不知道),告诉编译器这是一个尾递归函数,编译器可以自动优化成循环

例子

    tailrec fun findFixPoint(x:Double = 1.0) : Double 
        = if (x == Math.cos(x)) x else findFixPoint(Math.cos(x))

高阶函数

传入的参数是一个函数,个人认为相当于C/C++的函数指针,或者说传递了一个函数变量

例子

    fun<T> maxCustom(array:Array<T>, greater:(T,T) -> Boolean) : T? {
        /*
        这个地方
        greater(T, T) -> Boolean
        表示一个函数名为greater,参数为两个T类型,返回值的Boolean的函数
        */
        var max:T? = null
        for (item in array) {
            if (max == null || greater(item, max)) {
                max = item
            }
        }
        return max
    }

调用

    val arr:Array<Int> = arrayOf(1,2,3)
    btn.setOnClickListener {
        text.text = "最大值为${maxCustom<Int>(arr, {a,b ->  a > b}).toString()}"
    }//使用lambad表达式

系统增强函数

扩展函数

可以给已有的类中添加函数,作为成员函数

例子

    fun TextView.println(str:CharSequence) {
        append("${str}\n")
    }
    fun TextView.print(str:CharSequence) {
        append(str)
    }

调用

和正常成员函数一样调用

    val text:TextView = findViewById(R.id.text)
    val btn:Button = findViewById(R.id.btn)
    btn.setOnClickListener {
        text.println("123")
        text.print("demo")
    }

单例对象

用object替换class,这样其中的所有函数都是静态成员函数了

相当于static修饰符

上一篇下一篇

猜你喜欢

热点阅读