• 作者:老汪软件技巧
  • 发表时间:2024-09-02 04:02
  • 浏览量:

目录为什么需要使用with、applay以及runwith、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函数返回调用者本身。

这些函数可以帮助我们简化代码,提高可读性,并且避免重复地引用同一个对象。