美文网首页
Kotlin学习2

Kotlin学习2

作者: flynnny | 来源:发表于2021-05-17 19:13 被阅读0次

    1什么时匿名函数

    定义函数时不取名字的函数,我们称之为匿名函数,匿名函数通常整体传递给其他函数,或者从其他函数返回。
    匿名函数对Kotlin来说很重要,有了他,我们能够根据需要制定特殊规则,轻松定制标准库里的内置函数

    fun main(){
      val total:Int = "Mississippi".count()
      println(total)//字符串长度
      
      val totalS:Int = 
        "Mississippi".count({letter->letter =='s'})
      println(totalS)//s字符个数
    }
    

    2函数类型与隐式返回

    匿名函数也有类型,匿名函数可以当做变量赋值给函数类型变量,就像其他变量一样,匿名函数就可以在代码里传递了。变量有类型,变量可以等于函数,函数也会有类型。函数的类型,由传入的参数和返回值类型决定。
    和具名函数不一样,除了极少情况外,匿名函数不需要return关键字来返回数据,匿名函数会隐式或自动返回函数体最后一行语句的结果。

    fun main(){
      //变量的类型是一个匿名函数
      val blessingFunction:()->String 
      blessingFunction = {
        val holiday = "National Day."
        "Happy $holiday"
      }
      println(blessingFunction())
    }
    

    3匿名函数参数

    和具名函数一样,匿名函数可以不带参数,也可以带一个或者多个任何类型的参数,需要带参数时,参数的类型放在匿名函数的类型定义中,参数名则放在函数定义中

    fun main(){
      val blessingFunction:(String)->String 
      blessingFunction = {name->
        val holiday = "National Day."
        "$name,Happy $holiday"
      }
      println(blessingFunction("Jack"))
    }
    

    4 it关键字

    定义只有一个参数的匿名函数时,可以用it关键字表示参数名。当你需要传入两个值参,it关键字就不能用了。

    fun main(){
      val blessingFunction:(String)->String 
      blessingFunction = {
        val holiday = "National Day."
        "$it,Happy $holiday"
      }
      println(blessingFunction("Jack"))
    }
    

    it非常重要,应用广泛。函数式编程很多情况下都用

    5匿名函数的类型推断

    定义一个变量时,如果已把匿名函数作为变量赋值给他,就不需要显示指明变量类型。

    fun main(){
      val blessingFunction = {
        val holiday = "National Day."
        "Happy $holiday"
      }
      println(blessingFunction())
    }
    

    和java代码块要区分出来。

    类型推断也支持带参数的匿名函数,但为了帮助编译器更准确的推断变量类型,匿名函数的参数名和参数类型必须有。

    fun main(){
      val blessingFunction:(String ,Int)->String = {name,year->
        val holiday = "National Day."
        "$name ,Happy $holiday $year"
      }
    
    //或者下面这样
    
      val blessingFunction = {name:String,year:Int->
        val holiday = "National Day."
        "$name ,Happy $holiday $year"
      }
      println(blessingFunction("Jack",2027))
    }
    

    6什么是lambda

    我们将匿名函数称为lambda,将他的定义称为lambda表达式,他的返回数据称为lambda结果。为什么叫lambda?lambda也可以用希腊字符“入”表示,是lambda演算的简称,lambda演算是一套数理演算逻辑,有数学家Alonzo Church于20世纪30年代发明,在定义匿名函数时 ,使用了lambda演算记法。

    7定义参数是函数的函数

    函数的参数是另一个函数

    fun main(){
      val getDiscountWords = {goodsName:String,hour :Int ->
        val currentYear = 2027
        "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
      }
      showOnBoard("卫生纸",getDiscountWords)
    }
    
    //具名参数
    fun showOnBoard(goodsName:String,showDiscount::(String,Int)->String){
      val hour = (1..24).shuffled().last()
      println(showDiscount(goodsName,hour))
    }
    

    8简略写法

    如果一个函数的lambda参数排在最后,或者是为一个参数,那么阔住lambda值参的一对圆括号就可以省略

    fun main(){
      "Mississippi".count({it == 's'})
      "Mississippi".count{it == 's'}
    }
    
    fun main(){
      showOnBoard("卫生纸"){goodsName:String,hour :Int ->
        val currentYear = 2027
        "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
      }
    }
    
    //具名参数
    fun showOnBoard(goodsName:String,showDiscount:(String,Int)->String){
      val hour = (1..24).shuffled().last()
      println(showDiscount(goodsName,hour))
    }
    

    9函数内联

    lambda趋势可以让你更灵活的编写应用,但是,灵活也是要付出代价的。
    在JVM上,你定义的lambda会以对象实例的形式存在,JVM会为所有同lambda打交道的变量分配内存,这就产生了内存开销。更糟糕的是,lambda的内存开销会带来严重的性能问题。幸运的是,kotlin有一种优化内存机制叫内联,有了内联,JVM就不需要使用lambda对象实例了,因为避免了变量内存分配。那里需要使用lambda,编译器就会将函数体复制黏贴到哪里。
    使用lambda的递归函数无法内联,因为会导致复制黏贴无限循环,编译会发出警告。

    10函数引用

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

    fun main (){
      //要获得函数引用,使用::操作符,后面跟要引用的函数名。
      showOnBoard("卫生纸",::getDiscountWords)
    }
    fun showOnBoard(goodsName:String,showDiscount:(String,Int)->String){
      val hour = (1..24).shuffled().last()
      println(showDiscount(goodsName,hour))
    }
    fun getDiscounWords(goodsName:String,hour:Int):String{
      val currentYear = 2027
      return "${currentYear}年,双11${goodsName}促销倒计时:$hour 小时"
    }
    

    11函数类型作为返回类型

    函数类型也是有效的返回类型

    fun main(){
      val getDiscountWords = configDiscountWords();
      println(getDiscountWords("牙膏"))
    }
    
    fun configDiscountWords():(String)->String{
      val currentYear = 2027
      val hout=(1..24),shuffled().last()
      return { goodsName:String->
          hour +=20
          "${currentYear}年,双11${goodsName}促销倒计时:${hour}小时"
      }
    }
    

    12闭包

    在kotlin中,匿名函数能够修改并引用定义在自己作用域之外的变量,匿名函数引用着定义自身的函数里的变量,Kotlin中的lambda就是闭包

    能接受函数或者返回函数的函数又叫高级函数,高级函数广泛应用于函数式编程当中。

    java通过package吧作用于做好了;
    kotlin作用域管理通过闭包。

    13lambda与匿名内部类

    java8支持面向对象编程和lambda表达式,但不支持将函数作为参数传给另一个函数或者变量,不过java的替代方案是匿名内部类。

    java中做法:

    7.png

    创建了一个借口、+匿名内部类

    kotlin:

    8.png

    14小结

    相关文章

      网友评论

          本文标题:Kotlin学习2

          本文链接:https://www.haomeiwen.com/subject/opijjltx.html