with和apply是kotlin标准库中的函数,用来对一个对象进行多次操作,例如一个函数alphabet(),作用是返回ABC字母表的字符串。
fun alphabet(): String {
val result = StringBuilder("alphabet:\n")
for (letter in 'A'..'Z') {
result.append(letter)
}
result.append("\nI know the alphabet")
return result.toString()
}
//返回值
// alphabet:
// ABCDEFGHIJKLMNOPQRSTUVWXYZ
// I know the alphabet
上边函数中result: StringBuild一直在用,如果用with的话,可以这么写
fun alphabetWith() = with(StringBuilder()) {
append("alphabet:\n")
for (letter in 'A'..'Z') {
this.append(letter)
}
append("\nI know the alphabet")
this.toString()
}
这样通过with把StringBuild委托给后边lambda,lambda里可以直接用this指代StringBuild或者直接调用StringBuild的方法。
with的返回值是lambda的值,即最后lambda的一行,而apply返回的是整个对象:
fun allphabetApply() = StringBuilder().apply {
append("alphabet:\n")
for (letter in 'A'..'Z') {
append(letter)
}
append("\nI know the alphabet")
}.toString()
apply用起来和java里的构造者模式很像,比如我们自定义个View,采用构造者模式来初始化View的各个属性,用apply很简单就可以实现:
fun createMyTextView(context: Context) = MyTextView(context).apply {
text = "my text view"
textSize = 20.0
setPadding(10,10,10,10)
}
另外关与最开头的例子,kotlin有一个buildString函数,会自动生成一个StringBuild,并返回它的toString,用的就是apply实现的:
fun alphabetBuildString() = buildString {
append("alphabet:\n")
for (letter in 'A'..'Z') {
append(letter)
}
append("\nI know the alphabet")
}
网友评论