美文网首页
带接收者的lambda:“with”与“apply”

带接收者的lambda:“with”与“apply”

作者: Ryan_Hoo | 来源:发表于2018-07-21 23:04 被阅读0次

    lambda函数体内可以调用一个不同对象的方法,无序借助任何额外的限定符,这样的lambda叫做带接收者的lambda

    1.1、with函数

    fun alphabet():String{

         val resul = StringBuffer()

          return with(StringBuffer){

                   for(letter  in 'A'..'Z'){

                          this.append(letter) //通过显示的this来调用接收者值的类型

                   }

                   append("\nNow  I Konw  the alphabet")//可以省略this

                   this.toString()   //从lambda返回值

           }

    }

    with实际上接收了两个参数的函数。with函数把它的第一个参数转换成作为第二个参数传递给它的lambda的接收者。this指向了stringBuilder,这是传给with的第一个参数。可以通过显示的this引用来访问stringBuilder的方法。

    fun alphabet() = with(StringBuffer()){  //重构

                   for(letter  in 'A'..'Z'){

                          append(letter)

                   }

                   append("\nNow  I Konw  the alphabet")//可以省略this

                   toString()   //从lambda返回值

    }

    1.2、apply函数

    apply函数和with函数几乎一模一样。唯一区别apply始终会返回作为实参数传递给他的对象(返回接收者对象)

    fun alphabet() =StringBuilder().apply{

                  for(letter  in 'A'..'Z'){

                          append(letter)

                   }

                   append("\nNow  I Konw  the alphabet")//可以省略this

    } .toString()   //从lambda返回值

    apply 被声明成一个扩展函数。它的接收者变成了作为实参的lambda的接收者(即StringBuilder被传入lambda中)。执行apply的结果为StringBuilder。

    buildString的实参也是一个带接收者的lambda,其接收者就是StringBuilder

    fun alphabet() =buildString{

                  for(letter  in 'A'..'Z'){

                          append(letter)

                   }

                   append("\nNow  I Konw  the alphabet")//可以省略this

    }

    相关文章

      网友评论

          本文标题:带接收者的lambda:“with”与“apply”

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