Kotlin基础知识学习(三)

打印 上一主题 下一主题

主题 1045|帖子 1045|积分 3135

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
函数使用

根本用法

函数声明变化



  • 如果函数是公开的,则public关键字可以省略。
  • 用fun关键字表示函数的定义。
  • 如果函数没有返回值可以不用声明。
  • 如果函数表示重载,直接在fun同一行用override修饰。
  • 函数参数格式是变量名:变量范例。
  • 函数参数允许空值则在后面加上?。
  1. /**
  2. * 1、公共方法 public可以省略
  3. * 2、fun关键字表示函数定义
  4. * 3、test 方法名
  5. * 4、返回值在()后面,:Unit没有返回值,可以省略不写
  6. */
  7. fun test(){
  8.     println("没有入参,没有返回值的函数")
  9. }
复制代码
  1. fun test():Unit{
  2.     println("没有入参,没有返回值的函数")
  3. }
复制代码
  1.     //无参函数调用
  2.     test()//没有入参,没有返回值的函数
复制代码
入参格式



  • 参数格式(变量名:变量范例)
  • 允许变量为空格式(变量名:变量范例?)
  1. /**
  2. * 1、参数声明格式:变量:变量类型
  3. * @param name 名字
  4. * @param price 价格
  5. */
  6. fun test1(name:String,price:Int){
  7.     println("${name}买了一个${price}元的鸡蛋")
  8. }
复制代码
  1.     //有参函数调用
  2.     test1("张三",10)//张三买了一个10元的鸡蛋
复制代码
  1. /**
  2. * 1、如果参数运行为空在变量类型后面加上?
  3. * @param name 名字
  4. * @param price 价格
  5. */
  6. fun test1(name:String?,price:Int){
  7.     if(name != null){
  8.         println("${name}买了一个${price}元的鸡蛋")
  9.     }
  10. }
复制代码
返回格式



  • 如果有返回值需要在()后面加上返回值范例,格式(:返回值范例),可以明白成跟变量定义一样。
  • 如果没有返回值可以不用写,默认也会返回一个Unit范例对象。
  • 返回值也是在方法体里用return返回。
  1. /**
  2. * 1、有返回值需要在()后面加上【:返回值类型】
  3. * 2、方法体需要通过return 返回对应类型的数据
  4. * @param name 名字
  5. * @param price 价格
  6. */
  7. fun test2(name:String,price:Int):String{
  8.     println("${name}买了一个${price}元的鸡蛋")
  9.     return "${name}买到鸡蛋了"
  10. }
复制代码
  1.     //有返回值的函数调用
  2.     var str = test2("李四",1)//李四买了一个1元的鸡蛋
  3.     println(str)//李四买到鸡蛋了
复制代码
入参参数的变化

参数默认值



  • 函数入参参数可以指定默认值
  • 格式(变量名:变量范例 = 默认值)
  1. /**
  2. * 1、参数可以指定默认值
  3. * 2、格式:变量类型=默认值
  4. * @param mountain
  5. */
  6. fun test(mountain:String,first:String="东岳泰山", second:String="西岳华山", third:String="南岳衡山", fourth:String="北岳恒山",five:String="中岳嵩山"){
  7.     println("${mountain}是$first,$second,$third,$fourth,$five")
  8. }
复制代码
  1.     //参数指定默认值,调用的时候可以不用再写
  2.     test("中国五岳")//中国五岳是东岳泰山,西岳华山,南岳衡山,北岳恒山,中岳嵩山
  3.     //调用的时候修改默认值,第一个默认参数可以直接修改
  4.     test("中国五岳","泰山")//中国五岳是泰山,西岳华山,南岳衡山,北岳恒山,中岳嵩山
复制代码
指定参数的默认值



  • 如果在函数调用的时间,只想改某个参数的默认值,可以通过变量名进行指定。
  1.     //如果修改的不是第一个有默认值的参数,需要通过变量名指定
  2.     test("中国五岳", second = "华山")//中国五岳是东岳泰山,华山,南岳衡山,北岳恒山,中岳嵩山
复制代码
可变参数



  • kotlin中可变参数是用关键字vararg进行修饰。
  • 格式(vararg 变量名:变量范例)。
  • 函数在解析的时间会将可变参数转化成数组,可通过数组情势进行访问。
  1. /**
  2. * 1、参数可用可变参数,用关键字vararg说明
  3. * 2、格式:vararg 参数变量名:类型
  4. * 3、kotlin在解析的时候会把可变参数解析成数组
  5. * @param mountain
  6. */
  7. fun test1(mountain:String,vararg strArray:String){
  8.     var str = ""
  9.     for (item in strArray){
  10.         str += "$item "
  11.     }
  12.     println("${mountain}是$str")
  13. }
复制代码
  1. test1("中国五岳", "东岳泰山","西岳华山","南岳衡山","北岳恒山","中岳嵩山")//中国五岳是东岳泰山 西岳华山 南岳衡山 北岳恒山 中岳嵩山
复制代码
特别函数

泛型函数



  • 定义泛型函数时,得在函数名称前面添加“”,表示以T声明的参数(包括输入参数和输出参数),其参数范例必须在函数调用时指定。
  • 调用格式(函数名称<具体范例>)。
  1. /**
  2. * 泛型函数:<T> T表示泛型
  3. */
  4. fun <T> test(tag:String,vararg array:T){
  5.     var str:String = "$tag:"
  6.     for (item in array){
  7.         str = "$str${item.toString()} "
  8.     }
  9.     println(str)//中国五岳:东岳泰山 西岳华山 南岳衡山 北岳恒山 中岳嵩山
  10. }
复制代码
  1.     test<String>("中国五岳","东岳泰山","西岳华山","南岳衡山","北岳恒山","中岳嵩山")
  2.     test<Int>("10以内的偶数",2,4,6,8,10)//10以内的偶数:2 4 6 8 10
复制代码
内联函数



  • 内联函数在编译的时间被内联睁开,即将函数体直接插入到调用该函数的地方。
  • 内联函数主要用于消除函数调用的开销,特别是对于那些小而频仍调用的函数非常有用。
  • 内联函数还可以用于实现一些高级特性,如非局部返回和重尾递归优化。
  • 用关键字inline表示内联函数。
  1. /**
  2. * 内联函数 用关键字inline
  3. * 在调用处将函数体直接插入
  4. */
  5. inline fun <T> setNumber(number: T){
  6.     println(number)
  7. }
复制代码
  1.     setNumber(1)
  2.     setNumber("张三")
复制代码
函数简化



  • 函数有返回值定义可以当初特别的变量,变量可以通过=进行赋值,所以对于函数体是比力简单的可以通过=直接赋值给函数。
  1. fun compare(a:Int,b:Int):Int{
  2.     if(a > b){
  3.         return a
  4.     } else {
  5.         return b
  6.     }
  7. }
  8. /**
  9. * 函数有返回值定义可以当初特殊的变量,变量可以通过=进行赋值
  10. * 所以对于函数体是比较简单的可以通过=直接赋值给函数
  11. */
  12. fun compare1(a:Int,b:Int) = if(a > b) a else b
  13. fun factorial(n:Int):Int {
  14.     if (n <= 1) return n
  15.     else return n*factorial(n-1)
  16. }
  17. fun factorial1(n:Int) = if (n <= 1) n else n*factorial(n-1)
复制代码
  1.     println(compare1(1,3))//3
  2.     println(factorial1(3))//6
复制代码
尾递归函数



  • 尾递归(Tail Recursion)是一种递归情势,其中递归调用是函数执行的末了一步。
  • 通过关键字tailrec修饰。
  • 尾递归优化是一种编译器优化技能,可以将尾递归调用转换为循环,从而避免栈溢出并进步性能。
  1. /**
  2. * 尾递归函数,用tailrec进行修饰
  3. */
  4. tailrec fun tailRecursiveFactorial(n: Int, accumulator: Int = 1):Int{
  5.     if(n <= 1){
  6.         return accumulator
  7.     } else {
  8.         return tailRecursiveFactorial(n-1,n*accumulator)
  9.     }
  10. }
复制代码
  1. println(tailRecursiveFactorial(3))//6
复制代码
高阶函数



  • 高阶函数(Higher-Order Function)是指一个函数,它可以吸取另一个函数作为参数,大概返回一个函数作为效果。
  • 高阶函数提供了一种非常机动和强大的方式来处理函数逻辑,使得代码更加模块化和可重用。
吸取函数作为参数

高阶函数可以吸取一个或多个函数范例的参数。
格式:函数名称参数)->函数返回值
  1. /**
  2. * 函数A作为函数B的参数
  3. * operation:(Int,Int) -> Int
  4. * operation是函数A的名称
  5. * (Int,Int)是函数A的参数
  6. * -> Int是函数A的返回值类型
  7. */
  8. fun applyOperation(x:Int,y:Int,operation:(Int,Int) -> Int):Int{
  9.     return operation(x,y)
  10. }
复制代码
  1.     //{ a, b -> a + b } 表示参数函数A的参数和函数体,用->隔开
  2.     var result = applyOperation(2,3) { a, b -> a + b }
  3.     println(result)//5
  4.     var result1 = applyOperation(2,3) { a, b -> a * b }
  5.     println(result1)//6
复制代码
返回函数作为效果

高阶函数可以返回一个函数范例的效果。
格式:在高阶函数后面参数)->返回值范例
  1. /**
  2. * 函数A作为函数B的返回值
  3. * :(Int,Int)->Int
  4. * (Int,Int)是函数A的参数
  5. * ->Int 函数A的返回值
  6. */
  7. fun functionB(a:Int):(Int,Int)->Int{
  8.     return when(a){
  9.         1 -> {b,c -> b+c}
  10.         2 -> {b,c -> b-c}
  11.         3 -> {b,c -> b*c}
  12.         else -> {b,c -> b/c}
  13.     }
  14. }
复制代码
  1.     //返回函数
  2.     var functionA = functionB(1)
  3.     println(functionA(3,5))//8
  4.     functionA = functionB(2)
  5.     println(functionA(3,5))//-2
复制代码
标准库中的高阶函数

Kotlin 标准库中有许多高阶函数,好比 let、run、apply、also、filter、map 等。这些函数极大地简化了聚集操作和其他常见编程使命。
  1. val numbers = listOf(1, 2, 3, 4, 5)
  2. val doubled = numbers.map { it * 2 }
  3. println(doubled) // 输出: [2, 4, 6, 8, 10]
复制代码
扩展函数

扩展函数(Extension Function)是一种特别范例的函数,它可以为现有的类添加新的成员函数,而无需使用继承或修改原有类的源代码。这种功能是通过静态成员函数的语法糖来实现的,只管在底层实现上它们并不是真正的类成员方法。
定义:扩展函数使用receiverType.functionName的语法进行定义,其中receiverType是你要扩展的类名,functionName是你想要添加的函数名。函数体内部可以通过this关键字来引用吸取者对象(即receiverType的实例)。
  1. /**
  2. * 扩展函数,格式:原有类.扩展函数的名称
  3. * 对系统Array类增加交换扩展函数
  4. */
  5. fun <T> Array<T>.swap(pos1:Int,pos2:Int){
  6.     val temp = this[pos1]
  7.     this[pos1] = this[pos2]
  8.     this[pos2] = temp
  9. }
复制代码
  1.     val intArray = arrayOf(1,2,3,4,5)
  2.     //扩展函数调用跟普通函数一样
  3.     intArray.swap(1,2)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表