首页 > 其他分享 >Android Kotlin优化代码整洁:with、applay以及run是什么,作用,区别

Android Kotlin优化代码整洁:with、applay以及run是什么,作用,区别

时间:2024-08-24 12:15:54浏览次数:8  
标签:run 函数 productList Kotlin add applay HomeProductBean val

目录


  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([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"
}

总结


  1. with函数和run函数的区别在于返回值,with返回函数块的最后一行代码的结果,而run返回函数块的最后一行代码的结果。

  2. apply函数返回调用者本身。

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

标签:run,函数,productList,Kotlin,add,applay,HomeProductBean,val
From: https://www.cnblogs.com/ls75/p/18377622

相关文章

  • STHTMLTestRunner
    #-*-coding:utf-8-*-"""ATestRunnerforusewiththePythonunittestingframework.ItgeneratesaHTMLreporttoshowtheresultataglance.Thesimplestwaytousethisistoinvokeitsmainmethod.E.g.importunittestimportHTML......
  • 安防视频监控EasyCVR视频汇聚平台出现代码层面报错“panic:runtime error”的原因排查
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构,兼容性强、支持多协议接入,包括国标GB/T28181协议、部标JT808、GA/T1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等。有用户反馈,启动EasyCVR......
  • facefusion整合包cuda 环境报错解决: onnxruntime::ProviderLibrary::Get [ONNXRuntim
    在b站下载了一个up提供的facefusion整合包,运行go-web.bat报错报错信息如下:2024-08-1910:53:07.6316097[E:onnxruntime:Default,provider_bridge_ort.cc:1992onnxruntime::TryGetProviderInfo_CUDA]D:\a\_work\1\s\onnxruntime\core\session\provider_bridge_ort.cc:1637......
  • lazarus 3.4+fpc trunk编译tachart控件出错
    lazarus3.4+fpctrunk编译tachart控件出错原因:最新的fpc禁止访问private引起的修改方法:1、打开lazarus\components\tachart\tadatatools.pas将functionTDataPointDistanceTool.FindRef(APoint:TPoint;AMode:TDataPointMode;ADest:TDataPointTool.TPointRef;AOtherEndS......
  • gitlab runner远程连接其他服务器
    1、部署gitlabrunner2、 注册完成后 在代码仓库的根目录有一个流水线脚本 ......
  • Android开发语言Kotlin简介
    官方认可:自2017年Google正式宣布Kotlin成为Android开发的官方语言后,它在Android开发中的流行度就有了显著提升。与Java的兼容性:Kotlin在设计时就考虑到了与Java的互操作性,这让开发者能够在Android项目中轻松使用Kotlin,同时继续利用现有的Java代码和库。......
  • pgsql登录不上,psql: error: connection to server on socket "/var/run/postgresql/.s
    背景在ubuntu上安装postgres,发现不能直接登录。分析默认是linux系统上的某个对应的用户才能使用对应的pg数据库的用户,因此我们需要作修改。解决编辑以下路径对应的文件,此处的14是版本,不知道的cd过去看看就行了。/etc/postgresql/14/main/pg_hba.conf将下图中对应位置改成m......
  • LoadRunner 12.55 解决录制 HTTPS网站,脚本空白问题
    背景:最近工作中项目有性能测试需求,但团队小伙伴用loadrunner12.55遇到https站点录制出来的脚本Action为空白,以往处理方式直接让项目团队将https改成http再重新录制痛点:修改http耗时长分析:项目web主要是内网使用,使用自签名证书,而loadrunner无该证书导致LoadrunnerProxyServer......
  • 记一次Kotlin Visibility Modifiers引发的问题
    概述测试环境爆出ERROR告警日志java.lang.IllegalStateException:Didn'tfindreportforspecifiedlanguage,登录测试环境ELK查到如下具体的报错堆栈日志:java.lang.IllegalStateException:Didn'tfindreportforspecifiedlanguageatcom.aba.report.service.biz.Assessme......
  • 《生化奇兵3》vcruntime140_1.dll丢失?推荐的vcruntime140_1.dll处理方式
    如果你在尝试运行“生化奇兵3”(BioShock3)这款游戏时遇到了丢失vcruntime140_1.dll文件的问题,可以采取以下几个步骤来解决这个问题。vcruntime140_1.dll文件简介vcruntime140_1.dll是MicrosoftVisualC++2015-2022Redistributable的一部分,用于支持使用VisualC++编译的应......