美文网首页
Kotlin学习笔记——基础语法篇之函数

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

作者: Jingtianer | 来源:发表于2019-03-29 20:47 被阅读0次

    函数的一般形式

        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
        }
    
    • fun后面加入<泛型列表>,表示泛型函数

    调用方法

        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修饰符

    相关文章

      网友评论

          本文标题:Kotlin学习笔记——基础语法篇之函数

          本文链接:https://www.haomeiwen.com/subject/xsnrbqtx.html