Android Kotlin最佳化程式碼整潔:with、applay以及run是什麼,作用,區別

前期メ后期發表於2024-08-24

目錄


  1. 為什麼需要使用with、applay以及run
  2. 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"
}

總結


  1. with函式和run函式的區別在於返回值,with返回函式塊的最後一行程式碼的結果,而run返回函式塊的最後一行程式碼的結果。

  2. apply函式返回撥用者本身。

  3. 這些函式可以幫助我們簡化程式碼,提高可讀性,並且避免重複地引用同一個物件。

相關文章