美文网首页
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