美文网首页
Kotlin基础之函数

Kotlin基础之函数

作者: sexyhair | 来源:发表于2018-04-22 16:20 被阅读0次

    函数的基本格式

    fun 函数名(参数名:参数类型):返回值类型
    

    说明:

    • 函数的声明使用 fun 关键字
    • 函数的调用与Java无异 对象.方法名(参数)
    • 无返回值类型使用 Unit 表示,允许省略
    • 函数修饰符默认是public,所以无public修饰
    • 重写的方法是:overrite fun 函数名(参数名:参数类型):返回值类型
    定义函数

    以下是定义函数的几种样式:

    • 定义无参数,无返回值的函数(表示无返回值的 Unit被省略了)

        fun init(){
            //函数体
        }
      
    • 定义无参数,无返回值的函数( Unit:类似Java中的void)

        fun get() : Unit{
            //函数体
        }
      
    • 定义无参数,返回值为String类型的public方法

       fun get() : String{
           //函数体
           return "你好"
       }
      
    • 定义 有参数,返回值为String类型的public方法

        fun get(str:String) : String{
            //函数体
            return "你好"
        }
      
    • 定义有参数,无返回值(参数1带问号,表示str参数可以是空值)

        fun set(str : String ?,int : Int,arr :Array<String>){
            //语句体
        }
      
    • 将表达式作为函数体、返回值类型自动推断的函数

        fun sun(a:Int,b:Int) = a+b
      
    基本格式-参数的几种形式
    • 默认参数

    默认参数:在定义函数时直接指定参数的默认值,
    格式:参数名:参数类型 = 参数默认值
    书写及调用如下

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //注意调用的时候没有给参数
        Log.i(tag,get())//输出结果:你好--Kotlin
        //提供参数值,则覆盖参数的默认值
        Log.i(tag,get("hello world"))//输出结果:hello world--Kotlin
    }
    /**
     * 有参数,返回值为String类型的public方法
     */
    fun get(str:String = "你好") : String{
        //函数体
        return str+"--Kotlin"
    }
    

    通过以上代码可以看到当函数是有默认参数的,那么调用时可以不给参数;给参则覆盖参数的默认值

    • 命名参数

    命名参数:调用时更换默认参数的值

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            /**
             输出结果:除了int外都是默认的参数
            Int类型参数值是:1
            String类型参数值是:你好
            Char类型参数值是:a
            Boolean类型参数值是:true
             */
            Log.i(tag,get1(1))
    
            /**
            输出结果:除了int外,Boolean 类型的参数发生了改变,调用方法时flag = false既是命名参数
            Int类型参数值是:1
            String类型参数值是:你好
            Char类型参数值是:a
            Boolean类型参数值是:false
             */
            Log.i(tag,get1(1,flag = false))
        }
    
        /**
         * 有参数,返回值为String类型的public方法
         */
        fun get1(int :Int ,str:String = "你好",char :Char = 'a', flag :Boolean = true) : String{
            //函数体
            return "Int类型参数值是:$int\nString类型参数值是:$str\nChar类型参数值是:$char\nBoolean类型参数值是:$flag"
        }
    
    • 可变参数

    某种类型的参数数量是不确定的,关键字vararg修饰
    格式:vararg str :String 表示String类型的参数是不固定的
    可变参数在使用时当做一个数组
    函数的参数不能出现2个vararg以上
    可变参数的类型可以是基本类型、数组、容器

    可变参数是基本类型,以Int为例

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.i(tag,get2(1,3,4))//输出结果:Int类型参数值是: 1, 3, 4,
    }
    
    /**
     * 有参数,是可变参数
     */
    fun get2(vararg int :Int ) : String{
        var str = ""
        for(it in int){
            str =  "$str $it,"
        }
        return "Int类型参数值是:$str"
    }
    

    可变参数是数组类型,以Array<Int>为例

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        /**
        输出结果:
        第1个参数数组的元素是:{ 1, 2, 3,}
        第2个参数数组的元素是:{ 11, 22, 33,}
        第3个参数数组的元素是:{ 111, 222, 333,}
         */
        Log.i(tag,get3(arrayOf(1,2,3), arrayOf(11,22,33), arrayOf(111,222,333)))
    
    }
    /**
     * 可变参数为数组类型
     */
    fun get3(vararg arrs :Array<Int> ) : String{
        var count = 1
        var t = ""
        for(it in arrs){
            //此时it表示的是一个数组参数
            var str = ""
            for(i in it){
                //此时i表示的是一个数组参数中的一个元素
                str =  "$str $i,"
            }
            var s = "第${count}个参数数组的元素是:{${str}}\n"
            count++;
            t = t +s
        }
        return t
    }
    

    可变参数是容器之队列,以List<String>为例

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        /**
        输出结果:
        第1个参数数组的元素是:{ 1q, 2q, 3q,}
        第2个参数数组的元素是:{ 11q, 22q, 33q,}
        第3个参数数组的元素是:{ 111q, 222q, 333q,}
         */
    
        Log.i(tag,get4(listOf("1q","2q","3q"), listOf("11q","22q","33q"), listOf("111q","222q","333q")))
    
    }
    
    /**
     * 可变参数是List<String>
     */
    fun get4(vararg arrs :List<String> ) : String{
        var count = 1
        var t = ""
        for(it in arrs){
            //此时it表示的是一个队列参数
            var str = ""
            for(i in it){
                //此时i表示的是一个数组参数中的一个元素
                str =  "$str $i,"
            }
            var s = "第${count}个参数数组的元素是:{${str}}\n"
            count++;
            t = t +s
    
        }
        return t
    }
    

    特殊函数

    • 泛型函数
    • 内联函数
    • 简化函数
    • 尾递归函数
    • 高阶函数
    泛型函数

    定义泛型函数格式:fun <T>函数名(参数名:T){}
    泛型函数可以定义在类的外面,是一个全局函数。

    内联函数

    定义内联函数格式:inline fun <reified T : Number>函数名(参数名:T){}
    内联函数编译的时候回再调用处把该函数的内部代码直接赋值一份,调用几次就会复制几次(考虑内存泄漏)
    Kotlin中要求参数类型完全匹配(子父类,实现类都不可以的)

    /**
     * 内联函数:有点参数传递的是父类,调用的时候给参数是子类
     * 因为Kotlin要求参数类型完全匹配
     */
    inline fun <reified T : Number>  sum (array : Array<T>) : String{
        var str = ""
        for(it in array){
            str =  "$str $it,"
        }
        return str;
    }
    
    class MainActivity : AppCompatActivity() {
        val tag = "MainActivity"
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            Log.i(tag,sum(arrayOf(1,2,3,4,5)))
            Log.i(tag,sum(arrayOf(1.0,2.0,3.0,4.0,5.0)))
        }
    }
    
    简化函数

    格式: fun 函数名(参数名:参数类型):返回值类型 = 函数体
    函数体比较简单的时候

    fun sum(a : Int ,b : Int) :Int = if(a >= 0 && b >= 0) a+b else Math.abs(a)+Math.abs(b)
    
    尾递归函数

    尾递归函数:函数末尾的返回值重复调用了自己
    格式:tailrec fun 函数名(参数名:参数类型):返回值类型{}
    tailrace:告诉编译器是尾递归函数,编译器会相应的优化的

    高阶函数

    高阶函数:函数B的参数中包含另一个函数A,那么函数B就是高阶函数,函数A成为高阶函数的函数参数

    增强系统函数

    • 扩展函数
    • 扩展高阶函数
    • 日期时间函数
    • 单例对象
    扩展函数
    扩展高阶函数
    日期时间函数
    单例对象

    参考资料:《Kotlin从零到精通-Android开发》
    Demo地址:https://github.com/sexyhair79/demokotlinBasics

    相关文章

      网友评论

          本文标题:Kotlin基础之函数

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