Android开发Kotlin DSL使用技巧掌握

目录
  • 前言
  • 什么是 DSL?
  • 您使用任何 DSL 吗?
  • 为什么我们使用 DSL?
    • 我们如何编写自己的 DSL?
    • 中缀
    • 调用
  • 现在,让我们讨论 Android 中 DSL 的用例和示例。

前言

在这篇文章中,我们将学习如何在您的 Android 项目中编写 Kotlin DSL。

这个文章会很长,所以花点时间,让我们一起来写你的 DSL。我们将讨论以下主题,

  • 什么是简单英语中的 DSL?
  • 您使用任何 DSL 吗?
  • 为什么我们使用 DSL?
  • 我们如何编写自己的 DSL
  • 基本示例说明。

那么让我们开始吧。

什么是 DSL?

维基百科的定义说,

领域特定语言( DSL) 是专门针对特定应用领域的计算机语言。这与广泛适用于跨领域的通用语言(GPL)形成对比。

喜欢认真吗?

一般而言,DSL 为您提供了任何特定语言的灵活工具,以利用特定编程语言提供的功能。

您使用任何 DSL 吗?

如果您是一名 android 开发人员并且在您的项目中使用 kotlin,您可能会有意或无意地在您的项目中使用 DSL?你能想出一个例子吗?

让我帮你,你有没有写过类似的代码,

yourlist.forEach {
    //your code is here
}

上面的例子是在 Kotlin 的列表中使用forEach。forEach is kotlin 是 DSL 的一个例子

为什么我们使用 DSL?

我们应该使用 DSL 来简化和提高应用程序的复杂性,并使代码更具可读性。

我们如何编写自己的 DSL?

在开始编写我们自己的 DSL 之前,我们需要了解带有接收器的 lambda。
但也让我简要概述一下 lambda with receiver

假设我们有一个函数 buildString,

fun buildString(action: (StringBuilder).() -> Unit): String {
    val stringBuilder = StringBuilder()
    action(stringBuilder)
    return stringBuilder.toString()
}

在这里,我们有一个函数buildString,它将动作(它是一个函数)作为参数。此处的action函数以StringBuilder作为参数,函数buildString以 String 作为返回类型。

现在,要使用我们编写的buildString ,

buildString {
    append("<")
    append("MindOrks")
    append(">")
}

我们在这里使用 Kotlin 的属性来传递与 StringBuilder 相关的属性,因为我们在buildString函数中使用了扩展函数的强大功能。

我们还可以使用创建自定义 DSL,

中缀

在 Kotlin 中,中缀帮助我们创建自定义 DSL,类似于我们用英语编写的方式。例如,

在英语中,我们说“1加2”来求和或求差,我们说“1减2”。使用中缀调用可以在 Kotin 中实现类似的事情。

为了创建一个中缀来添加我们使用的数字,

infix fun Int.plus(number: Int) = this + number

在这里,我们创建了一个 Int 的扩展函数,加上它接受一个数字并返回这个 + 数字的总和。这是应用函数的数字。

所以,要使用我们使用的这个中缀函数,

val output = 1 plus 2

在上面的代码中,我们使用我们创建加号的中缀函数来生成输出。当我们在 Logcat 中打印它时,它会打印3作为总和。

这是因为我们创建了一个中缀扩展函数来使用加号文本代替“ + ”,我们将其用作传统方式。

同样,如果我们想让中缀函数减号,我们使用

infix fun Int.minus(number: Int) = this - number

为了使用它,我们使用,

val output = 1 minus 2

中缀使代码具有可读性并且非常有序,任何人都可以阅读。因此,如果任何对编程一无所知的人也可以说这是对两个数字进行加法或减法。

调用

在调用中,运算符允许将任何对象作为函数调用。在这里,让我们创建一个名为Student的类,

class Student {
    operator fun invoke(student: Student.() -> Unit) = student
    fun addName(name: String) {
        //implementation
    }
    fun addMarks(marks: Int) {
        //implementation
    }
}

在类中,我们创建了一个函数调用,它接受一个学生类型的参数并返回学生本身。所以,这里我们可以在student本身的对象中使用Student类的所有方法。

现在,要使用 Class,我们仍然会像在 Kotlin 中一样创建对象,

val student = Student()

现在你可以看到我们有另一个函数叫做addName 和addMarks**我们将把它用作 DSL。但是,在这里我们可以以两种不同的方式使用它。两者如下,

  • 类型 - 1(传统方式)
student.addName("MindOrks")
student.addMarks(100)

上面的代码就像我们以前在 Android 中做的旧的传统方式。2.DSL方式

student {
    addName("MindOrks")
    addMarks(100)
}

在这里,我们使用 Kotlin DSL。如果你注意到了,我们有类似的 lambda,

Student.() -> Unit

如果你注意到了,我们在那里有一个.()。它指定 lambda 有一个接收器,要使用它,我们需要创建一个类的构造。这就是您可以使用调用来创建 DSL 的方式。

通过以上方式,您可以在 Kotlin 中创建您赢得的 DSL。

现在,让我们讨论 Android 中 DSL 的用例和示例。

  • 数据类

在此,让我们讨论如何创建数据类的 DSL。考虑我们有一个数据类 Student

data class Student(
    var name: String? = null,
    var age: Int? = null,
    var marks: Int? = null
)

在此,如果我们使用我们编写的数据类,

val student =  Student(
      "MindOrks",
      20,
      30
  )

现在要在 DSL 中转换上述代码,

现在我们将创建一个新的 lambda,如下所示,

fun student(student: Student.() -> Unit): Student = Student().apply(student)

在上面的代码中,

我们有一个接收器,参数为 student 并将其用作我们使用的 DSL,

val student = student {
    name = "MindOrks"
    age = 20
    marks = 30
}

这就是我们可以将数据类转换为 DSL 的方法。

  • UI 元素

为此,让我们将 textView 视为 UI 元素。在那,我们使用如下,

textView.text = "MindOrks"
textView.setOnClickListener {
}
textView.setTextColor(Color.BLACK)

但是要通过我们使用的 DSL 使用它,

textView.apply {
    text = "MindOrks"
    setOnClickListener {
    }
    textColor(Color.BLACK)
}

我们使用apply在任何 UI元素中创建 DSL

  • JSON

在我们使用的 Android 中创建 JSON,

val jsonObject = JSONObject()
jsonObject.put("name","MindOrks")
jsonObject.put("age",20)

这是创建 JSON 对象的传统方式。

现在,让我们看看如何创建 DSL 来创建 JSON。首先,我们将创建一个类并使用 JSONObject() 对其进行扩展,

class Json() : JSONObject() {
}

现在,我们将使用带有接收器的 lambda 构造函数

constructor(json: Json.() -> Unit) : this() {
    this.init()
}

将使用中缀创建一个泛型来向 JSON 对象添加值。

看起来像,

infix fun <T> String.to(value: T) {
    put(this, value)
}

在这里,它将使用字符串键放置值,而值将使用“ to”的类型。

现在,完整的类文件看起来像,

class Json() : JSONObject() {
    constructor(json: Json.() -> Unit) : this() {
        this.json()
    }
    infix fun <T> String.to(value: T) {
        put(this, value)
    }
}
//为了在 Activity 文件中使用它,我们使用刚刚创建的 DSL 创建 JSON,
val json = Json {
    "name" to "MindOrks"
    "age" to 20
}

这里,

  • to是我们为将值放入 JSON 对象而创建的中缀。
  • JSON 是我们创建的类,它使用键和值来创建 JSON 对象。

当我们在 Logcat 中打印它时,我们得到以下输出,

{"name":"MindOrks","age":20}

这就是您可以在 kotlin 代码中创建 DSL 的方式。

翻译链接

https://blog.mindorks.com/mastering-kotlin-dsl-in-android-step-by-step-guide

以上就是Android开发Kotlin DSL使用技巧掌握的详细内容,更多关于Android开发Kotlin DSL的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android Kotlin全面详细类使用语法学习指南

    目录 前言 1. 类的声明 & 实例化 2. 构造函数 2.1 主构造函数 2.2 次构造函数 3. 类的属性 4. 可见性修饰符 5. 继承 & 重写 6. 特殊类 6.1 嵌套类(内部类) 6.2 接口 6.3 数据类 6.4 枚举类 总结 前言 Kotlin被Google官方认为是Android开发的一级编程语言 今天,我将主要讲解kotlin中的类的所有知识,主要内容包括如下: 1. 类的声明 & 实例化 // 格式 class 类名(参数名1:参数类型,参数名2:参数类型

  • kotlin android extensions 插件实现示例详解

    目录 前言 原理浅析 总体结构 源码分析 插件入口 配置编译器插件传参 编译器插件接收参数 注册各种Extension IrGenerationExtension ExpressionCodegenExtension StorageComponentContainerContributor ClassBuilderInterceptorExtension PackageFragmentProviderExtension 总结 前言 kotlin-android-extensions 插件是 Ko

  • Android开发Kotlin实现圆弧计步器示例详解

    目录 效果图 定义控件的样式 自定义StepView 绘制文本坐标 Android获取中线到基线距离 效果图 定义控件的样式 看完效果后,我们先定义控件的样式 <!-- 自定义View的名字 StepView --> <!-- name 属性名称 format 格式 string 文字 color 颜色 dimension 字体大小 integer 数字 reference 资源或者颜色 --> <declare-styleable name="StepView&q

  • Android kotlin+协程+Room数据库的简单使用

    Room Room是Google为了简化旧版的SQLite操作专门提供的 1.拥有了SQLite的所有操作功能 2.使用简单(类似于Retrofit),通过注解的方式实现相关功能.编译时自动生成实现类impl 3.LiveData,LifeCycle,Paging天然融合支持 导入 ... plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-android-extensions' id 'kotlin-kap

  • Android 开发与代码无关技巧详解

    目录 1.如何找到代码 (1)无敌搜索大法 (2)log输出大法 (3)profiler查看大法 (4)万能法找到页面 2.如何解决bug (1)先看再想最后动手 (2)改变现状 (3)是技术问题还是业务问题 (4)张张嘴远胜于动动手 (5)bug解决不了,那就解决提出bug的人 (6)解决了bug之后 3.如何实现不会的功能 (1)不要急着拒绝 (2)大事化小小事化了 心态要稳,天塌了有个高的顶着 1.如何找到代码 作为客户端的开发,工作中经常遇到,后端的同事来帮忙找接口详情.产品经理来询问之

  • Android开发必备知识 为什么说Kotlin值得一试

    1.Hello, Kotlin Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 1.1 Kotlin的身世 写了许久Java,有没有发现其实你写了太多冗余的代码? 后来你体验了一下Python,有没有觉得不写分号的感觉真是超级爽? 你虽然勤勤恳恳,可到头来却被NullPointerException折磨的死去活来,难道就没有受够这种日子么? 直到有一天你发现自己已经写了好几十万行

  • kotlin开发cli工具小技巧详解

    目录 脚手架 开搞 开发调试 jcommander Main 函数声明 压缩模板 放飞自我 生成最终产物 结尾 脚手架 脚手架是为了保证各施工过程顺利进行而搭设的工作平台 而在程序开发过程中,每个工程或者说公司也都需要一个脚手架工具.通过脚手架命令行的形式简化开发流程,避免发生一些人为的相对低级的问题,所以这个也就是为什么叫做脚手架的原因吧. 而由于每个公司的代码规范都不同,一般情况下会主动让开发同学进行工程方面的cv操作,就是成本高并且容易出错.这也就是为什么我们打算写一些这样的工具的原因.

  • 详解Kotlin Android开发中的环境配置

    详解Kotlin Android开发中的环境配置 在Android Studio上面进行安装插件 在Settings ->Plugins ->Browse repositores.. ->kotlin 安装完成后重启Android Studio就生效了 如图所示: 在Android Studio中做Kotlin相关配置 (1)在根目录 的build.gradle中进行配置使用,代码如下: buildscript { ext.kotlin_version = '1.1.2-4' repos

  • 如何使用Kotlin进行Android开发

    Kotlin是一门基于JVM的编程语言,它正成长为Android开发中用于替代Java语言的继承者.Java是世界上使用最多的编程语言之一,当其他编程语言为更加便于开发者使用而不断进化时,Java并没有像预期那样及时跟进. Kotlin是由JetBrains创建的基于JVM的编程语言,IntelliJ正是JetBrains的杰作,而Android Studio是基于IntelliJ修改而来的.Kotlin是一门包含很多函数式编程思想的面向对象编程语言. Kotlin生来就是为了弥补Java缺失的

  • 解析Android开发优化之:从代码角度进行优化的技巧

    通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能.下面我们就从几个方面来了解Android开发过程中的代码优化. 1)静态变量引起内存泄露 在代码优化的过程中,我们需要对代码中的静态变量特别留意.静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销毁.所以,一般情况下,静态变量

  • Android开发小技巧篇之集合

    1.对于过多的控件,功能类似,数量又多的,可以用include方法.在实现应用中,可以把控件放入List集合中. private void initView() { // TODO Auto-generated method stub pwd1 = (EditText) findViewById(R.id.pwd_et_6_1); pwd2 = (EditText) findViewById(R.id.pwd_et_6_2); pwd3 = (EditText) findViewById(R.i

  • Android编程开发之性能优化技巧总结

    本文详细总结了Android编程开发之性能优化技巧.分享给大家供大家参考,具体如下: 1.http用gzip压缩,设置连接超时时间和响应超时时间 http请求按照业务需求,分为是否可以缓存和不可缓存,那么在无网络的环境中,仍然通过缓存的httpresponse浏览部分数据,实现离线阅读. 2.listview 性能优化 1).复用convertView 在getItemView中,判断convertView是否为空,如果不为空,可复用.如果couvertview中的view需要添加listern

  • Android开发中的简单设置技巧集锦

    本文实例总结了Android开发中的简单设置技巧.分享给大家供大家参考,具体如下: 1开机图片: android-logo-mask.png android-logo-shine.png 这两个图片一个在上一个在下 ./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes/assets/images/android-logo-shine.png ./frameworks/base/core

随机推荐