kotlin不容忽视的小细节

简介: kotlin不容忽视的小细节

kotlin支持扩展函数

Kotlin的扩展函数可以让你作为一个类成员进行调用的函数,但是是定义在这个类的外部。这样可以很方便的扩展一个已经存在的类,为它添加额外的方法。

rxjava线程切换:

fun <T> Observable<T>.setThread(): Observable<T> {
    return subscribeOn(Schedulers.io())
         .observeOn(AndroidSchedulers.mainThread())
}

findViewById:

fun <V : View> Activity.bindView(id: Int): Lazy<V> {
    return lazy { findViewById<V>(id) }
}

更加通用的自定义表达式:

    fun <T> T.checkExpression(expression: Boolean, function: T.() -> T): T {
        if (expression) {
            function.invoke(this)
        }
        return this
    }

    还可以定义些通用函数

      /**
       * int px转dp
       */
      fun Int.toDp(): Int{
          val scale = App.context.resources.displayMetrics.density
          return (this * scale + 0.5f).toInt()
      }
      /**
       * float px转dp
       */
      fun Float.toDp(): Float{
          val scale = App.context.resources.displayMetrics.density
          return this * scale + 0.5f
      }
      /**
       * List<T>转Map<K,T>,获取对数据
       */
      inline fun <K,T> Iterable<T>.toMap(transform: (T) -> K): MutableMap<K, T>{
          val map = mutableMapOf<K, T>()
          forEach {
              map[transform.invoke(it)] = it
          }
          return map
      }
      /**
       * List<T>转List<R>
       */
      inline fun <T, R> Iterable<T>.convert(transform: (T) -> R): Iterable<R>{
          val list = mutableListOf<R>()
          forEach {
              list.add(transform.invoke(it))
          }
          return list
      }

      协程

      类似于线程,但是占用内存更低且更高效,同时在协程中执行代码,是顺序执行,而java 线程需要通过回调。

            // do first: main
            // do async: DefaultDispatcher-worker-5
            // do end: main
            GlobalScope.launch(Dispatchers.Main) {
                println("do first: ${Thread.currentThread().name}")
                GlobalScope.async(Dispatchers.Default) {
                    println("do async: ${Thread.currentThread().name}")
                }.await()
                println("do end: ${Thread.currentThread().name}")
            }

        kotlin的lambda表达式规则

        不用lambda表达式:

          // 这里举例一个Android中最常见的按钮点击事件的例子
          mBtn.setOnClickListener(object : View.OnClickListener{
                  override fun onClick(v: View?) {
                      Toast.makeText(this,"onClick",Toast.LENGTH_SHORT).show()
                  }
              })

          等价于:

            // 调用
            mBtn.setOnClickListener { v -> Toast.makeText(this,"onClick",Toast.LENGTH_SHORT).show() }

            特性如下:

            • 表达式总是被大括号括着
            • 其参数(如果存在)在 -> 之前声明(参数类型可以省略)
            • 函数体(如果存在)在 -> 后面

            相比java8的lambda表达式,还有其他特性:

            当方法中最后一个参数为函数类型,则可以放在大括号调用

              fun lambdaFun(boolean: Boolean, block: (Int) -> Unit){
              }
              fun lambdaFunTest(){
                  lambdaFun(true, block = {
                  })
                  lambdaFun(true){
                  }
              }

              it

              it是在当一个高阶函数中Lambda表达式的参数只有一个的时候可以使用it来使用此参数。it可表示为单个参数的隐式名称,是Kotlin语言约定的。

                val arr = arrayOf(1,3,5,7,9)
                // 过滤掉数组中元素小于2的元素,取其第一个打印。这里的it就表示每一个元素。
                println(arr.filter { it < 5 })
                相关文章
                |
                前端开发 Java 关系型数据库
                【Mybatis-Plus】mybatisplus更新时,实体字段为空,数据库不更新的解决方案
                【Mybatis-Plus】mybatisplus更新时,实体字段为空,数据库不更新的解决方案
                917 0
                |
                9月前
                |
                域名解析 缓存 网络协议
                减少域名dns解析时间
                域名解析中的TTL值设置多少合适
                521 5
                |
                6月前
                |
                人工智能 运维 数据可视化
                玩转云服务器——阿里云操作系统控制台体验测评
                在云服务器日益普及的背景下,运维人员对操作系统管理工具的要求不断提高。我们需要一款既能直观展示系统状态,又能智能诊断问题,提供专业指导的控制台。阿里云操作系统管理平台正是基于API、SDK、CLI等多种管理方式,致力于提升操作效率,为用户带来全新的系统运维体验。阿里云操作系统控制台凭借便捷易用的设计和高效的管理功能,成为云服务器运维的强力助手。本次测评基于真实体验截图,对其整体表现进行了深入探索。
                254 33
                |
                12月前
                |
                机器学习/深度学习 自然语言处理 搜索推荐
                探索深度学习与自然语言处理(NLP)在智能客服系统中的创新应用
                探索深度学习与自然语言处理(NLP)在智能客服系统中的创新应用
                725 1
                |
                SQL 分布式计算 大数据
                MaxCompute操作报错合集之遇到报错"ODPS-0130071:[1,8] Semantic analysis exception - class Ssf for user defined function ansy_xx cannot be loaded from any resources",该怎么办
                MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
                1010 5
                |
                机器学习/深度学习 数据采集 算法
                深入理解并应用机器学习算法:支持向量机(SVM)
                【5月更文挑战第13天】支持向量机(SVM)是监督学习中的强分类算法,用于文本分类、图像识别等领域。它寻找超平面最大化间隔,支持向量是离超平面最近的样本点。SVM通过核函数处理非线性数据,软间隔和正则化避免过拟合。应用步骤包括数据预处理、选择核函数、训练模型、评估性能及应用预测。优点是高效、鲁棒和泛化能力强,但对参数敏感、不适合大规模数据集且对缺失数据敏感。理解SVM原理有助于优化实际问题的解决方案。
                |
                人工智能 前端开发 算法
                【2023五福】创新科技与传统年俗的有机融合 - AI 年画
                23 年兔年,五福项目将传统的写福字升级成了年画,用户通过绘制兔子轮廓可以得到活动的兔子,同时由 AI 生成对应的兔子年画,整个过程给用户带来很强的惊喜感,同时将具有传统氛围的年画与科技感拉满的 AI 作图有机结合,为大家带来全新的年俗体验。AI 年画作为 23 兔年五福的创新项目,在玩法和技术方案上都采用全新的实现,前后端技术、AI 算法深度,以及美术互动等深度协同,实现了玩法了技术的双创新,最
                【2023五福】创新科技与传统年俗的有机融合 - AI 年画
                |
                Web App开发 监控 网络协议
                |
                Java 测试技术 API
                Java语言源文件:深入解析与编程实践
                Java语言源文件:深入解析与编程实践
                357 0
                |
                应用服务中间件 Shell nginx
                docker学习笔记2,入门到精通
                docker学习笔记2,入门到精通