最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android開發(fā)Kotlin?DSL使用技巧掌握

 更新時間:2022年11月18日 11:37:22   作者:Himanshu?Singh  
這篇文章主要為大家介紹了Android開發(fā)Kotlin?DSL使用技巧的掌握,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

在這篇文章中,我們將學習如何在您的 Android 項目中編寫 Kotlin DSL。

這個文章會很長,所以花點時間,讓我們一起來寫你的 DSL。我們將討論以下主題,

  • 什么是簡單英語中的 DSL?
  • 您使用任何 DSL 嗎?
  • 為什么我們使用 DSL?
  • 我們如何編寫自己的 DSL
  • 基本示例說明。

那么讓我們開始吧。

什么是 DSL?

維基百科的定義說,

領域特定語言( DSL) 是專門針對特定應用領域的計算機語言。這與廣泛適用于跨領域的通用語言(GPL)形成對比。

喜歡認真嗎?

一般而言,DSL 為您提供了任何特定語言的靈活工具,以利用特定編程語言提供的功能。

您使用任何 DSL 嗎?

如果您是一名 android 開發(fā)人員并且在您的項目中使用 kotlin,您可能會有意或無意地在您的項目中使用 DSL?你能想出一個例子嗎?

讓我?guī)湍悖阌袥]有寫過類似的代碼,

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函數中使用了擴展函數的強大功能。

我們還可以使用創(chuàng)建自定義 DSL,

中綴

在 Kotlin 中,中綴幫助我們創(chuàng)建自定義 DSL,類似于我們用英語編寫的方式。例如,

在英語中,我們說“1加2”來求和或求差,我們說“1減2”。使用中綴調用可以在 Kotin 中實現類似的事情。

為了創(chuàng)建一個中綴來添加我們使用的數字,

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

在這里,我們創(chuàng)建了一個 Int 的擴展函數,加上它接受一個數字并返回這個 + 數字的總和。這是應用函數的數字。

所以,要使用我們使用的這個中綴函數,

val output = 1 plus 2

在上面的代碼中,我們使用我們創(chuàng)建加號的中綴函數來生成輸出。當我們在 Logcat 中打印它時,它會打印3作為總和。

這是因為我們創(chuàng)建了一個中綴擴展函數來使用加號文本代替“ + ”,我們將其用作傳統方式。

同樣,如果我們想讓中綴函數減號,我們使用

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

為了使用它,我們使用,

val output = 1 minus 2

中綴使代碼具有可讀性并且非常有序,任何人都可以閱讀。因此,如果任何對編程一無所知的人也可以說這是對兩個數字進行加法或減法。

調用

在調用中,運算符允許將任何對象作為函數調用。在這里,讓我們創(chuàng)建一個名為Student的類,

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

在類中,我們創(chuàng)建了一個函數調用,它接受一個學生類型的參數并返回學生本身。所以,這里我們可以在student本身的對象中使用Student類的所有方法。

現在,要使用 Class,我們仍然會像在 Kotlin 中一樣創(chuàng)建對象,

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 有一個接收器,要使用它,我們需要創(chuàng)建一個類的構造。這就是您可以使用調用來創(chuàng)建 DSL 的方式。

通過以上方式,您可以在 Kotlin 中創(chuàng)建您贏得的 DSL。

現在,讓我們討論 Android 中 DSL 的用例和示例。

  • 數據類

在此,讓我們討論如何創(chuàng)建數據類的 DSL。考慮我們有一個數據類 Student

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

在此,如果我們使用我們編寫的數據類,

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

現在要在 DSL 中轉換上述代碼,

現在我們將創(chuàng)建一個新的 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元素中創(chuàng)建 DSL。

  • JSON

在我們使用的 Android 中創(chuàng)建 JSON,

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

這是創(chuàng)建 JSON 對象的傳統方式。

現在,讓我們看看如何創(chuàng)建 DSL 來創(chuàng)建 JSON。首先,我們將創(chuàng)建一個類并使用 JSONObject() 對其進行擴展,

class Json() : JSONObject() {
}

現在,我們將使用帶有接收器的 lambda 構造函數

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

將使用中綴創(chuàng)建一個泛型來向 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 文件中使用它,我們使用剛剛創(chuàng)建的 DSL 創(chuàng)建 JSON,
val json = Json {
    "name" to "MindOrks"
    "age" to 20
}

這里,

  • to是我們?yōu)閷⒅捣湃?JSON 對象而創(chuàng)建的中綴。
  • JSON 是我們創(chuàng)建的類,它使用鍵和值來創(chuàng)建 JSON 對象。

當我們在 Logcat 中打印它時,我們得到以下輸出,

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

這就是您可以在 kotlin 代碼中創(chuàng)建 DSL 的方式。

翻譯鏈接 

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

以上就是Android開發(fā)Kotlin DSL使用技巧掌握的詳細內容,更多關于Android開發(fā)Kotlin DSL的資料請關注腳本之家其它相關文章!

相關文章

最新評論

兴国县| 玉山县| 金塔县| 邯郸县| 临猗县| 松原市| 兰州市| 库车县| 盐源县| 诏安县| 晴隆县| 莱芜市| 丹东市| 濮阳市| 疏附县| 海阳市| 延庆县| 微山县| 乌恰县| 安庆市| 贡嘎县| 凉城县| 宜黄县| 米脂县| 页游| 东平县| 黔东| 侯马市| 铁力市| 昌图县| 潍坊市| 临安市| 保康县| 名山县| 宝兴县| 黄平县| 南澳县| 岳阳市| 枣阳市| 文安县| 安岳县|