Kotlin学习笔记五

                                                        函数的基本用法

一. 申明方式

             1. 这里我们举例java中的onCreate()方法:

              eg:        override fun onCreate(savedInstanceState:Bunndle?){}

             1)  Kotlin 默认函数就是公开的,所以不用申明其是public

             2)Kotlin 直接在函数前用"override"来表示重载操作

             3)Kotlin 中如果无参数返回,则不用任何特别说明

             4)Kotlin 中函数格式为"函数名称:变量类型"

             5)Kotlin 中使用关键字"fun"表示函数的定义

             6)Kotlin  中使用了空安全机制,如果某个变量允许为空,就在变量类型后面加"?"

         2. 输入参数的格式:

            1) 如果我们需要在函数中带入参数执行,此时很简单的定义:

              fun getInfo(age:Int,name:String){} 

             2)如果我们需要传递某个参数可允许为空的话,如下

           fun getInfo(age:Int,name:String,sex:String){

              tv.text=if(sex!=null)"姓名:$name 年龄:$age 性别$sex"

                          else"他是太监???"

}

        3.具有返回值的函数

               kotlin中具有返回值的函数一般如下定义:

                   fun  main():Int

                            注意:无返回值的函数,实际上是kotlin的优化,其实实际上是这样写:

                                              eg:    fun getInfo():Unit{}

                                                       Unit类型的参数无需申明,所以一般我们直接省略,直接写成un getInfo()  大家知道就行了

 

二. 输入参数的变化

       1) 默认参数

        fun getInfo(def:String,occupation:String="学生",school:String="铃兰高中"):String{

               var info:String="$def 他的职业是$occupation并且他是$school的人,你敢找他打架吗?"

}

      我们调用这个函数的时候,因为又默认参数,而且还有三个参数,使用默认参数调用方式

         button.setOnClickListener{

      getInfo("前提他使人")

}

       如果我们不想要默认值,如下带入参数就行了:

 button.setOnClickListener{

      getInfo("前提他使人","学生","凤仙高中")

}

     2)可变参数

kotlin体系中新增了关键字vararg表示其后的参数是不确定的。

               eg: fun getFourBigVararg(general:String,first:String,second:String,third:String,fourth:String,vararg otherArray:String?):String{

             var answer:String="$general:$first,$second,$third,$fourth"

//我们通过for循环拿到不定参数

               for(item in otherArray){

            answer ="$answer,$item"

           return answer

}

}

   调用方式如下:

               btn.setOnClickListener{

             tv.text = if(isOld)  getFourBigVararg("古代四大发明") else

                 getFourBigVararg("古代四大发明","造纸术","印刷术","火药","指南针","丝绸","瓷器","茶叶")

                   isOld =!isOld

}

三. 可变参数

          几种特殊的函数

         1)泛型函数

          fun appendString(tag:String,vararg otherInfo:T?):String{

                  var str:String="$tag:"

                for(item in otherInfo){

              str="$str${item.toString()},"

            return str

       }

}

        2)内联函数

          内联函数在编译的时候会在调用处把该函数的内部代码直接复制一份,调用10次就会复制10次,而非普通的函数那样仅仅会提供一个函数访问的地址。

          在函数fun前面添加inLine便是函数是内联函数

                      eg:该函数及不接收Array,也不接收Array,只好沦为孤家寡人

                               fun setArrayNumber(array:Array){

                            var str:String="数组元素依次排列:" 

                       for(item in array){

                    str = str+item.toString()+","

}                         

tv.text= str

}

//只有内联函数才可以被具体化

inline fun setArrayStr(array:Array){

          var str:String ="数组元素一次排列"

          for(item in array){

         str=str +item.toString()+","

}

         tv.text=str

}

    3)简化函数

 这个非常简单,一个例子就可以了  ,计算n! 的结果

    fun factorial(n:Int):Int{

             if(n<=1) n

            else n*factorial(n-1)

}         

我们在Java中实现可能要递归处理

            Kotlin把函数当作一种特殊变量,则允许通过等号给函数这个变量进行赋值,可写成如下:

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

4)尾递归函数

         尾递归函数需要在函数fun的前面加上关键字tailrec

         此时的编译器会自动优化,即用循环的方式代替递归,从而避免栈溢出的情况

         求余余弦不动点的函数是尾递归函数

          tailrec fun findFixPoint(x:Double=1.0):Double

              =if(x==Math.cos(x)) x else findFixPoint(Math.cos(x))

5)高阶函数

这个意思是把A函数当作B函数作为输入参数

            四. 增强系统函数

1) 扩展函数

                扩展函数允许开发者给系统类给系统类补写新的方法

               我们定义一个数组元素交换的函数:

                   fun array.swap(pos1:Int,pos2:Int){

                 val tmp =this[pos1]

                this[pos1] = this[pos2]

                this[pos2] = tmp

}

2)扩展高阶函数

3)日期时间函数           

4)单例对象

你可能感兴趣的:(移动开发)