目录
- 为什么需要使用with、applay以及run
- with、applay以及run是什么、作用以及三者区别
一、为什么需要使用with、applay以及run
我们在开发项目的过程当中,不可避免,一个界面的内容会有很多,如下initivew方法,会有Recyclerview的初始化,长按以及触摸事件设置,以及生命周期的注册,主要是Recyclerview:
override fun HomeFragmentHomeBinding.initView() {
lifecycle.addObserver(myHandler)
startRefreshime()
//设置布局排列方式,默认垂直排列
val gridLayoutManager: GridLayoutManager =
GridLayoutManager([email protected], 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([email protected], 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函数返回调用者本身。
-
这些函数可以帮助我们简化代码,提高可读性,并且避免重复地引用同一个对象。