• kotlin 函数


      函数(function)和方法(method)这两个概念经常被混淆,他们到底有什么关联和区别?其实,它俩没有什么区别只是不同语言叫法不一样,在Java中普遍叫方法。而在Kotlin中普遍叫函数。重点是:函数(function)和方法(method)是同一个东西,别搞错了。

    函数定义使用关键字 fun,参数格式为:参数 : 类型

    1. fun sum(a:Int ,b:Int ) :Int {  // Int 参数,返回值 Int
    2. return a+b
    3. }

    表达式作为函数体,返回类型自动推断:

    1. fun sum(a:Int ,b:Int) =a+b 
    2. public fun sum(a:Int,b:Int) :Int=a+b   // public 方法则必须明确写出返回类型

    无返回值的函数Unit(类似Java中的void):

    1. fun printSum(a:Int,b:Int) :Unit{
    2. print(a+b)
    3. }
    // 如果是返回 Unit类型,则可以省略(对于public方法也是这样):
    1. fun printSum(a:Int,b:Int){
    2. print(a+b)
    3. }

    可变长参数函数

    函数的变长参数可以用 vararg 关键字进行标识:

    1. fun vars(vararg v:Int){
    2. for(vt in v){
    3. print(vt)
    4. }
    5. }
    6. //测试
    7. fun main(args:Array<String)){
    8. vars(1,3,4,2,5)
    9. }
    • 函数的参数默认值
      • 如果不打算传入值参,可以预先给参数指定默认值

    • 具名函数参数
      • 如果使用命名值参,就可以不用管值参的顺序(当参数过多的时候可以使用)

    1. fun main() {
    2. println(doUserInfo("ShuaiCi", 18))
    3. //如果使用命名值参,就可以不用管值参的顺序
    4. println(doUserInfo(age = 6, name = "Kotlin"))
    5. //默认参数,可不传age
    6. println(doScUserInfo("Android"))
    7. //可传age
    8. println(doScUserInfo("Java",30))
    9. }
    10. private fun doUserInfo(name: String, age: Int): String {
    11. return "$name 今年已经$age 了哦"
    12. }
    13. //默认参数:预先给age指定默认值15
    14. private fun doScUserInfo(name: String, age: Int = 15): String {
    15. return "$name 今年已经$age 了哦"
    16. }

    lambda(匿名函数)

    lambda表达式使用实例:

    定义 val 方法名:(类型)->返回类型={参数名 ->方法体,最后一句是返回值,}

    匿名函数不需要return关键字来返回数据,匿名函数会隐式或自动返回函数体最后一行语句的结果

    1. // 测试
    2. fun main(args: Array<String>) {
    3. val sumLambda: (Int, Int) -> Int = {x,y -> x+y}
    4. println(sumLambda(1,2)) // 输出 3
    5. }
    匿名函数参数只有一个 默认it
    1. val lamber4:(Int)->String={
    2. "$it"
    3. }

    匿名函数可以不带参数,也可以带一个或多个任何类型的参数。

    1. fun main() {
    2. //1、声明函数的输入() 输出String
    3. //2、实现函数
    4. val scFun :() -> String = {
    5. val name = "帅次"
    6. // 匿名函数不需要写retrun,最后一行就是返回值
    7. "$name 就是个战五渣"
    8. }
    9. }

    无参类型推断
            实践

    1.     //无参类型推断
    2.     val scFun4 = {
    3.         val name = "帅次"
    4.         // 匿名函数不需要写retrun,最后一行就是返回值
    5.         "$name 无参类型推断"
    6.     }


    带参类型推断

    1. //带参类型推断
    2. val scFun5 = { age:Int,money:Float->
    3. val name = "帅次"
    4. // 匿名函数不需要写retrun,最后一行就是返回值
    5. "$name 带参类型推断 $age 岁啦,兜里$money"
    6. }
    7. println(scFun5(15,1.25f))

    定义一个函数:参数是函数
            一个函数,作为另一个函数的参数。

          

    1. fun main() {
    2.     //2、声明函数
    3.     val bookBeginner = {bookName:String,price:Double->
    4.         "$bookName 定价为:$price"
    5.  
    6.     }
    7.     //3、调用函数,传入函数bookBeginner
    8.     learningAndroidBook("帅次",bookBeginner)
    9. }
    10. //1、定义一个函数(learningAndroidBook):参数是函数(bookPrice)
    11. fun learningAndroidBook(name:String,bookPrice:(String,price:Double)->String){
    12.     println("$name 来自 learningAndroidBook ")
    13.     println(bookPrice(name,48.88))
    14. }

    简略写法
            一个函数的lambda参数排在最后,或者是唯一的参数,那么括住lambda值参的一对圆括号就可以省略。

    1. fun main() {
    2.     //4、简略写法(参数排在最后)
    3.     learningAndroidBook("Kotlin 简略写法"){bookName:String,price:Double->
    4.         "$bookName 定价为:$price"
    5.     }
    6.     //5、简略写法(唯一一个参数),()省略了
    7.     learningAndroidBook2{bookName:String,price:Double->
    8.         "$bookName 定价为:$price"
    9.     }
    10. }
    11. //定义一个函数,参数是函数
    12. fun learningAndroidBook2(bookPrice:(String,price:Double)->String){
    13.     println(bookPrice("Kotlin 简略写法-唯一一个参数",48.88))
    14. }

    函数引用
            要把函数作为参数传给其他函数使用,除了传lambda表达式(匿名函数),kotlin还提供了其他方法,传递函数引用,函数引用可以把一个具名函数转换成一个值参,使用lambda表达式的地方,都可以使用函数引用。

            

    1. fun main() {
    2.     //6.2、函数引用
    3.     learningAndroidBook("函数引用",::bookPriceName);
    4. }
    5. //6.1 定义具名函数
    6. fun bookPriceName(bookName:String,price:Double):String{
    7.     //具名函数这里要加return
    8.     return "$bookName 定价为:$price"
    9. }
    10. //1、定义一个函数(learningAndroidBook):参数是函数(bookPrice)
    11. fun learningAndroidBook(name:String,bookPrice:(String,price:Double)->String){
    12.     println("$name 来自 learningAndroidBook ")
    13.     println(bookPrice(name,48.88))
    14. }
    15. ——————

    函数返回类型为匿名函数

    1. fun main() {
    2.     //使用
    3.     val funName = helloSc()
    4.     println(funName(15))
    5. }
    6. //定义具名函数,返回类型为匿名函数
    7. fun helloSc():(Int)->String{
    8.     val name = "渣渣次"
    9.     //返回的匿名函数,age传入的参数
    10.     return {age->
    11.         //匿名函数返回类型
    12.         "$age 岁的$name"
    13.     }
    14. }

  • 相关阅读:
    【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第六章 Vim 编辑器的使用
    Android---Android 是如何通过 Activity 进行交互的
    LeetCode 每日一题 2022/8/1-2022/8/7
    白细胞膜修饰介孔二氧化硅纳米颗粒/细胞膜包裹载microRNA表面修饰氨基介孔硅球的研究
    C++11的std::function和bind绑定器
    并查集专题
    创建vue3项目、链式调用、setup函数、ref函数、reactive函数、计算和监听属性、vue3的生命周期、torefs的使用、vue3的setup写法
    如何将 SonarQube和 SonarScanner 扫描vue项目bug?
    开篇——初识云原生
    课件演示用什么软件?万兴录演:多种录屏方式任你选
  • 原文地址:https://blog.csdn.net/luoj_616/article/details/126706191