美文网首页
带接收者的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