常常會用到的幾個擴展函數canvas
用it代指本身,最後一行結果做爲返回值,前面能夠用?和!判空bash
@Test fun test(){
val str = "test"
val result = str.let {
println(it)
"123"
}
println(result)
}
//輸出結果
test
123
複製代碼
使用舉例app
arguments?.let {
if (it.containsKey(CHOOSE_DATE) && it.containsKey(CHOOSE_STATE)) {
attendanceTime = it.getString(CHOOSE_DATE)
attendanceState = it.getString(CHOOSE_STATE)
}
}
複製代碼
with 須要傳入對象做爲參數,函數體內可直接調用該對象的屬性方法,返回值爲最後一行的結果,但不能同let同樣使用?和!判空
複製代碼
@Test fun test(){
val str = "test"
val result = with(str) {
println(length)
"123"
}
println(result)
//輸出結果
4
123
}
複製代碼
使用舉例函數
with(UserInfoHelper) {
saveValue(USERNAME, username)
saveValue(DEPARTNAME, departname)
saveValue(TOKEN, token)
saveValue(ORGCODE, orgcode)
}
複製代碼
能夠看做with 和 let 的結合版 ,函數體內能夠調用自身的屬性方法,可用this代指本身,最後一行結果做爲返回值,前面能夠用?和!判空
複製代碼
@Test fun test(){
val str = "test"
val result = str.run {
println(length)
"123"
}
println(result)
}
//輸出結果
4
123
複製代碼
使用舉例ui
edt_password.setText(intent?.run { getStringExtra(PASSWORD) })
atv_phone.setText(intent?.run { getStringExtra(PHONE) })
複製代碼
also同let函數相似,函數體內用it代指本身,區別在於返回值不一樣,also函數的返回值爲自身
複製代碼
@Test fun test(){
val str = "test"
val result = str.also{
println(it)
}
println(result)
}
//輸出結果
test
test
複製代碼
使用舉例this
val view = LayoutInflater.from(context).inflate(R.layout.monthly_choose_view, this, false).also {initView(it) }
private fun initView(view: View) = with(view) {
tv_last_month.setOnClickListener(this@MonthlyChoiceView)
tv_next_month.setOnClickListener(this@MonthlyChoiceView)
...
}
複製代碼
apply和run相似,函數體內能夠直接調用自身的屬性方法,區別在於apply函數的返回值爲自身
複製代碼
@Test fun test(){
val str = "test"
val result = str.apply{
println(length)
println(this)
}
println(result)
}
//輸出結果
4
test
test
複製代碼
使用舉例spa
//畫筆
private val mPaint by lazy {
Paint().apply {
isAntiAlias = true
color = Color.RED
style = Paint.Style.FILL
strokeWidth = 10f
}
}
canvas?.drawCircle(innerCircleX, innerCircleY, innerCircleRadius, mPaint.apply { color = Color.WHITE })
複製代碼
能夠作個記錄,常常會用到,區別不大,只是做用域和返回值有差異,多用用天然就明白了code