Kotlin基础之函数

2018-04-22  本文已影响0人  sexyhair

函数的基本格式

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

说明:

定义函数

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

基本格式-参数的几种形式

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

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

上一篇下一篇

猜你喜欢

热点阅读