有名函数 匿名函数 (匿名)函数类型 lambda函数引用

有名函数:
有名称的函数。
fun doSomething(age:Int = 2, flag:Boolean):String{
      return "result"
  }

doSomething(25,true)



   /**
    
    count()是个标准函数
   {  letter  ->letter=='s'} 是个匿名函数,作为 count()的参数

  */
  val totalS = "Mississippi".count({letter  ->
        letter=='s'
      })

  println(totalS)

 匿名函数:

 此函数没有名字,只有方法体。
  匿名函数通常将自己作为整体作为一个参数  传递给其他的函数,或者从其他的函数体中返回。
  匿名函数不需要return 关键字来返回数据,其默认自动返回函数体最后一行语句结果。

函数式类型:

匿名函数也是有类型的

匿名函数 可以当做变量 赋值给 函数类型变量

 匿名函数不需要return 关键字来返回数据,其默认自动返回函数体最后一行语句结果。

如下:

//变量 haha2 的类型:()->Unit 无参无返回值类型
val haha2:()->Unit
//变量 haha3 的类型:()->Unit 无参无返回值的匿名函数类型
 val haha3:()->Unit={ println( "哈哈2") }

扫描二维码关注公众号,回复: 13191846 查看本文章
 //变量 haha4 的类型:(String)->Unit 有参无返回值的匿名函数类型
  val  haha4:(String)->Unit={str:String->
        println(str)
        "$str 哈哈42" //最后一行表示该匿名函数的返回值 // 匿名函数不需要return 关键字来返回数据,其默认自动返回函数体最后一行语句结果。
        }
    haha4("haha4")
    haha4.invoke("haha4")
 //变量 blessingFunction0 的类型:()->String  无参的字符串的类型
 val blessingFunction0:()->String

//变量blessingFunction1的类型:()->String 返回一个匿名函数 { val holiday = "New Year." "Happy $holiday" }
    //变量blessingFunction1 是个无参字符串类型的(匿名)函数类型的变量
    val blessingFunction1:()->String = {
        val holiday = "New Year."
        "Happy $holiday"
    }
    blessingFunction1.invoke()


  //简写
    val blessingFunction11 = {
       val holiday = "New Year."
       "Happy $holiday"
   }
    blessingFunction11.invoke()
 val blessingFunction13:(String,Int) -> String = {name:String, year:Int ->
         val holiday = "New Year."
         "$name, Happy $holiday $year"
     }
     blessingFunction13.invoke("方明飞",34)
    //简写
    val blessingFunction12 = {name:String, year:Int ->
         val holiday = "New Year."
        "$name, Happy $holiday $year"
    }
    blessingFunction12.invoke("方明飞",34)
 //变量 blessingFunction2的类型是个匿名函数类型:(String) -> String    有参的字符串的类型
    val blessingFunction2:(String) -> String = { name ->
        val holiday = "New Year."
        "$name, Happy $holiday" //最后一行(字符串)表示该匿名函数的返回值
    }
    blessingFunction2("方明飞")
    blessingFunction2.invoke("方明飞")

 一个(匿名)函数作为另一个函数的参数

 val getDiscountWords = {goodsName:String, hour:Int ->
        val currentYear = 2027
        "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
    }
    //常规法
    showOnBoard("卫生纸",getDiscountWords)
  //常规 匿名函数法
 showOnBoard("卫生纸",
        getDiscountWords={goodsName:String, hour:Int ->
            val currentYear = 2027
            "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
        }

    )

  //lambda表达法
  showOnBoard("卫生纸"){goodsName:String, hour:Int ->
        val currentYear = 2027
        "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
    }



/**
 *  一个匿名函数 作为另一个函数的参数
 * 参数: getDiscountWords: (String,Int) -> String 是个匿名函数
 *
 *
 * */
//具名函数
private inline fun showOnBoard(goodsName:String, getDiscountWords: (String,Int) -> String){
    val hour = (1..24).shuffled().last()
   
     getDiscountWords.invoke(goodsName,hour)
}

lambda的简略写法:

如果一个函数的最后一个参数是个lambda参数,或者一个函数的唯一的一个参数 是个lambda参数

那么括住lambda参数外面的一对圆括号就可以省略掉。

//函数最后一个参数是个lamda参数

 val getDiscountWords = {goodsName:String, hour:Int ->
        val currentYear = 2027
        "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
    }

    showOnBoard("卫生纸",getDiscountWords)
    showOnBoard("卫生纸",getDiscountWords={goodsName:String, hour:Int ->
        val currentYear = 2027
        "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
    })
    
  showOnBoard("卫生纸"){goodsName:String, hour:Int ->
        val currentYear = 2027
        "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
    }

//具名函数
private fun showOnBoard(goodsName:String, getDiscountWords: (String,Int) -> String){
    val hour = (1..24).shuffled().last()
     getDiscountWords(goodsName,hour)
    getDiscountWords.invoke(goodsName,hour)
}

 //函数只有一个lambda参数

 val getDiscountWords = {goodsName:String, hour:Int ->
        val currentYear = 2027
        "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
    }

 showOnBoard2(getDiscountWords)
 showOnBoard2(getDiscountWords={goodsName:String, hour:Int ->
         val currentYear = 2027
        "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
    })

 //lambda的简略写法:去掉参数lambda 外面的括号()
  showOnBoard2 { goodsName: String, hour: Int ->
        val currentYear = 2027
        "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
    }




private inline fun showOnBoard2(getDiscountWords: (String,Int) -> String){
    val hour = (1..24).shuffled().last()
     getDiscountWords("卫生纸",hour)
     getDiscountWords.invoke("卫生纸",hour)
}


lambda函数引用

我们知道把函数作为参数传递给其他的函数使用,出了lambda可以作为参数传递给一个函数作为参数。

kotlin 还提供了另外一个方法,传递函数的引用,函数引用可以把一个具名函数转换成一个函数值参(具名函数前加::)

函数类型(String)->String 作为一个函数的返回类型, 那么该函数的return 是个函数

函数configDiscountWords()的类型是个函数类型(String)->String  return 一个函数
  val getDiscountWords: (String) -> String = configDiscountWords()
    println(getDiscountWords("沐浴露"))


fun configDiscountWords(): (String) -> String{
    val currentYear = 2027
    val hour = (1..24).shuffled().last()
    return {goodsName: String ->
        "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
    }
}

  

闭包: 

匿名函数就是lambda lambda就是闭包    

猜你喜欢

转载自blog.csdn.net/qq_33552379/article/details/121256573
今日推荐