我的编程空间,编程开发者的网络收藏夹
学习永远不晚

切底掌握Android中的Kotlin DSL

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

切底掌握Android中的Kotlin 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. 类型 - 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 的用例和示例。

  1. 数据类

在此,让我们讨论如何创建数据类的 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 的方法。

  1. UI 元素

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

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

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

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

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

  1. 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  String.to(value: T) {    put(this, value)}

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

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

class Json() : JSONObject() {    constructor(json: Json.() -> Unit) : this() {        this.json()    }    infix fun  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.csdn.net/qq_39312146/article/details/131353631

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

切底掌握Android中的Kotlin DSL

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

掌握Android中的进程和线程

进程和线程是现代网络操作系统的核心概念。Android作为一种的、承袭Linux的移动操作系统,其进程和线程的概念是开发者和安全工作人员需要深入了解的问题。本文将详细介绍Android中的进程、线程以及相关的技术问题。进程和线程的基本概念当
2022-06-06

掌握Go语言文档中的sort.Slice函数实现切片排序

掌握Go语言文档中的sort.Slice函数实现切片排序,需要具体代码示例在Go语言中,切片是一种非常常见的数据结构,用于存储一系列相同类型的元素。在实际应用中,我们经常需要对切片进行排序,以满足不同的需求。Go语言中提供了sort包,其中
掌握Go语言文档中的sort.Slice函数实现切片排序
2023-11-03

简单掌握Android开发中彩信的发送接收及其附件的处理

一. 彩信发送: 彩信比短信麻烦很多。从sendMmsWorker函数的参数就可以看出来:(conv, mmsUri, persister, slideshow, sendReq) 上下文,uri,PduPersister(彩信是用pd
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录