目錄
- 為什麼需要使用with、applay以及run
- with、applay以及run是什麼、作用以及三者區別
一、為什麼需要使用with、applay以及run
我們在開發專案的過程當中,不可避免,一個介面的內容會有很多,如下initivew方法,會有Recyclerview的初始化,長按以及觸控事件設定,以及生命週期的註冊,主要是Recyclerview:
override fun HomeFragmentHomeBinding.initView() {
lifecycle.addObserver(myHandler)
startRefreshime()
//設定佈局排列方式,預設垂直排列
val gridLayoutManager: GridLayoutManager =
GridLayoutManager(this@HomeFragment.context, 4, GridLayoutManager.VERTICAL, false)
homeRvProduct.layoutManager = gridLayoutManager
//設定adapter
productList.add(HomeProductBean(R.drawable.product_1,"asdf"))
productList.add(HomeProductBean(R.drawable.product_1,"asdf"))
productList.add(HomeProductBean(R.drawable.product_1,"asdf"))
productList.add(HomeProductBean(R.drawable.product_1,"asdf"))
homeProductAdapter = HomeProductAdapter(productList)
homeRvProduct.adapter = homeProductAdapter
LongClickUtils.setLongClick(Handler(),clHomeTime,3000,object:View.OnLongClickListener{
override fun onLongClick(p0: View?): Boolean {
val findNavController = findNavController()
findNavController.navigate(R.id.home_action_home_homefragment_to_home_userloginfragment)
return true
}
})
clHomeBg.setOnTouchListener(this@HomeFragment)
}
這些程式碼寫在一起就非常混雜,如果區分開成為方法,導致方法很多,所以,在Kotlin中,with、apply 和 run 是三個非常有用的函數語言程式設計工具,它們常用於程式碼最佳化和簡潔化。我們來看看最佳化後的。
override fun HomeFragmentHomeBinding.initView() {
lifecycle.addObserver(myHandler)
startRefreshime()
//其實,你可以不用這with關鍵字,但是寫出來的程式碼冗餘,不好看,不簡潔,僅此而已。
//with 函式(也稱為擴充套件函式)用於將一個物件作為上下文,並在其上下文中執行程式碼塊。當你使用 with 函式時,你傳遞一個物件作為引數,然後在程式碼塊中可以使用這個物件。
with(homeRvProduct){
//設定佈局排列方式,預設垂直排列
val gridLayoutManager: GridLayoutManager =
GridLayoutManager(this@HomeFragment.context, 4, GridLayoutManager.VERTICAL, false)
layoutManager = gridLayoutManager
//設定adapter
productList.add(HomeProductBean(R.drawable.product_1,"asdf"))
productList.add(HomeProductBean(R.drawable.product_1,"asdf"))
productList.add(HomeProductBean(R.drawable.product_1,"asdf"))
productList.add(HomeProductBean(R.drawable.product_1,"asdf"))
homeProductAdapter = HomeProductAdapter(productList)
adapter = homeProductAdapter
}
LongClickUtils.setLongClick(Handler(),clHomeTime,3000,object:View.OnLongClickListener{
override fun onLongClick(p0: View?): Boolean {
val findNavController = findNavController()
findNavController.navigate(R.id.home_action_home_homefragment_to_home_userloginfragment)
return true
}
})
clHomeBg.setOnTouchListener(this@HomeFragment)
}
接下來我們看看with、apply 和 run 究竟是什麼?
二、with、applay以及run是什麼
2.1 with
with 將一個物件作為引數傳遞給一個函式,並在該函式內部使用該物件。
返回值是函式塊的最後一行程式碼的結果。
val list = mutableListOf(1, 2, 3)
val sum = with(list) {
println("List size before adding: ${this.size}")
this.add(4)
this.sum() // 假設sum是一個擴充套件函式,用於計算列表的和
}
println("Sum: $sum")
2.2 apply
apply 將一個物件作為引數傳遞給一個函式,並在該函式內部使用該物件。
返回值是該物件本身。這意味著你可以在鏈式呼叫中非常方便地使用apply
val person = Person().apply {
name = "John"
age = 25
}
2.3 run
run 函式與apply類似,也在物件上執行一個函式塊,但run返回的是函式塊中最後一個表示式的值,而不是物件本身。
val person = Person()
val result = person.run {
name = "John"
age = 25
"Person: \$name, Age: \$age"
}
總結
-
with函式和run函式的區別在於返回值,with返回函式塊的最後一行程式碼的結果,而run返回函式塊的最後一行程式碼的結果。
-
apply函式返回撥用者本身。
-
這些函式可以幫助我們簡化程式碼,提高可讀性,並且避免重複地引用同一個物件。