RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Kotlin的語(yǔ)法糖解析

jf_78858299 ? 來(lái)源:labuladong ? 作者:labuladong ? 2023-04-19 10:21 ? 次閱讀

最近又開(kāi)始要寫(xiě)一些客戶端代碼,現(xiàn)在項(xiàng)目都是使用Kotlin,但是之前沒(méi)有系統(tǒng)的學(xué)習(xí)過(guò)Kotlin,對(duì)于Kotlin的一些語(yǔ)法糖還不熟悉,所以寫(xiě)篇文章總結(jié)下。

變量聲明與類型推斷

Kotlin中可以使用關(guān)鍵字val和var聲明不可變變量和可變變量,而且可以根據(jù)變量的初始值自動(dòng)推斷出變量的類型。例如:

// Java代碼
String str = "Hello, world!";
List<String> list = new ArrayList<>();

// Kotlin代碼
val str = "Hello, world!"
val list = mutableListOf<String>()

使用上述Kotlin代碼,可以更加簡(jiǎn)潔地完成變量的聲明和類型推斷。

空安全機(jī)制

Kotlin中使用?和!!運(yùn)算符來(lái)處理空安全問(wèn)題,可以避免空指針異常的發(fā)生。例如:

// Java代碼
String str = null;
if (str != null) {
    int length = str.length();
}

// Kotlin代碼
val str: String? = null
val length = str?.length ?: 0

使用上述Kotlin代碼,可以更加簡(jiǎn)潔地處理空安全問(wèn)題。

Lambda表達(dá)式

Kotlin中可以使用Lambda表達(dá)式來(lái)代替匿名內(nèi)部類,可以更加簡(jiǎn)潔地編寫(xiě)函數(shù)式代碼。例如:

// 接收一個(gè)Int類型參數(shù),返回一個(gè)Int類型參數(shù)
val square: (Int) -> Int = { x -> x * x }

// 簡(jiǎn)化形式,使用it代替參數(shù)名
val square: (Int) -> Int = { it * it }

區(qū)間表達(dá)式

Kotlin中可以使用區(qū)間表達(dá)式來(lái)表示一段連續(xù)的數(shù)值范圍,可以更加簡(jiǎn)潔地完成一些循環(huán)操作。例如:

// Java代碼
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}

// Kotlin代碼
for (i in 0 until 10) {
    println(i)
}

數(shù)據(jù)類

Kotlin中的數(shù)據(jù)類是一種特殊的類,用于存儲(chǔ)數(shù)據(jù)。數(shù)據(jù)類可以自動(dòng)生成equals()、hashCode()、toString()等方法。在Kotlin中,可以使用data class關(guān)鍵字來(lái)定義數(shù)據(jù)類。例如:

// 定義一個(gè)數(shù)據(jù)類Person,包含name和age兩個(gè)屬性
data class Person(val name: String, val age: Int)

// 創(chuàng)建一個(gè)Person對(duì)象
val person = Person("John", 20)

// 自動(dòng)生成toString()方法,輸出:Person(name=John, age=20)
println(person)

擴(kuò)展函數(shù)

Kotlin中的擴(kuò)展函數(shù)是一種特殊的函數(shù),可以為任意類型添加新的函數(shù)。在Kotlin中,可以使用fun關(guān)鍵字來(lái)定義擴(kuò)展函數(shù)。例如:

// 為Int類型添加一個(gè)times()擴(kuò)展函數(shù),用于計(jì)算平方值
fun Int.times() = this * this

// 使用擴(kuò)展函數(shù)計(jì)算2的平方值
val square = 2.times() // 等價(jià)于2 * 2

命名參數(shù)

Kotlin中的命名參數(shù)可以讓函數(shù)調(diào)用更加靈活,可以指定參數(shù)的名稱。在Kotlin中,可以使用=符號(hào)來(lái)指定參數(shù)的名稱和值。例如:

// 定義一個(gè)函數(shù),包含兩個(gè)參數(shù)name和age
fun printInfo(name: String, age: Int) {
   println("$name is $age years old.")
}

// 使用命名參數(shù)調(diào)用函數(shù),參數(shù)的名稱可以任意指定
printInfo(age = 20, name = "John")

默認(rèn)參數(shù)

Kotlin中的默認(rèn)參數(shù)可以為函數(shù)參數(shù)指定默認(rèn)值,如果調(diào)用函數(shù)時(shí)沒(méi)有傳遞這個(gè)參數(shù),則使用默認(rèn)值。在Kotlin中,可以使用=符號(hào)來(lái)為參數(shù)指定默認(rèn)值。例如:

// 定義一個(gè)函數(shù),包含兩個(gè)參數(shù)name和age,age的默認(rèn)值為18
fun printInfo(name: String, age: Int = 18) {
   println("$name is $age years old.")
}

// 調(diào)用函數(shù)時(shí)不傳遞age參數(shù),將使用默認(rèn)值18
printInfo("John")

// 調(diào)用函數(shù)時(shí)傳遞age參數(shù),將使用傳遞的值
printInfo("Mary", 20)

中綴表示法

中綴表達(dá)式是 Kotlin 中另一個(gè)有趣的語(yǔ)法糖。在 Kotlin 中,我們可以使用 infix 關(guān)鍵字將某個(gè)函數(shù)標(biāo)記為中綴函數(shù)。這意味著我們可以在函數(shù)名和參數(shù)之間省略點(diǎn)號(hào)和括號(hào)。 例如,下面的代碼展示了如何使用中綴表達(dá)式:

class MyInt(val value: Int) {
    infix fun add(other: MyInt): MyInt {
        return MyInt(value + other.value)
    }
}

fun main() {
    val a = MyInt(2)
    val b = MyInt(3)

    val c = a add b // Using infix notation

    println(c.value) // Output: 5
}

在上面的代碼中,add 函數(shù)被標(biāo)記為中綴函數(shù)。因此,我們可以像使用運(yùn)算符一樣使用它,而無(wú)需使用點(diǎn)號(hào)和括號(hào)。

在實(shí)際編碼中,中綴表達(dá)式常常用于更自然地表達(dá)某些操作,例如 and 和 or 操作符:

fun main() {
    val a = true
    val b = false

    val c = a and b // Using infix notation
    val d = a or b // Using infix notation

    println(c) // Output: false
    println(d) // Output: true
}

在這個(gè)例子中,我們使用 and 和 or 操作符來(lái)演示中綴表達(dá)式的用法。由于這些操作符被標(biāo)記為中綴函數(shù),因此我們可以使用它們的中綴表達(dá)式形式來(lái)更自然地表達(dá)布爾運(yùn)算。

Elvis 運(yùn)算符 ?:

Elvis 運(yùn)算符 ?: 可以用于縮短空值檢查的代碼。它的使用方法是:當(dāng)左側(cè)的表達(dá)式非空時(shí),返回左側(cè)的值,否則返回右側(cè)的值。例如:

val name: String? = null
val message = "Hello, ${name ?: "Guest"}"
println(message) // Output: "Hello, Guest"

在上面的例子中,我們使用了 Elvis 運(yùn)算符 ?: 來(lái)檢查變量 name 是否為空。由于 name 是空的,所以表達(dá)式的結(jié)果是右側(cè)的字符串 "Guest"。

類型別名

類型別名可以讓我們給一個(gè)類型起一個(gè)別名,使得代碼更易讀。例如:

typealias UserName = String
typealias Password = String

fun login(username: UserName, password: Password) {
    // ...
}

在上面的代碼中,我們?yōu)?String 類型起了兩個(gè)別名,UserName 和 Password。這樣在函數(shù)參數(shù)中使用別名可以使代碼更具有可讀性。

in 運(yùn)算符

Kotlin 中的 in 運(yùn)算符可以用于判斷一個(gè)元素是否在一個(gè)區(qū)間、集合或數(shù)組中。例如:

val numbers = listOf(1, 2, 3, 4, 5)

if (3 in numbers) {
    println("3 is in the list")
}

在上面的代碼中,我們使用 in 運(yùn)算符來(lái)判斷數(shù)字 3 是否在 numbers 集合中。

解構(gòu)聲明

在 Kotlin 中,我們可以使用解構(gòu)聲明從一個(gè)對(duì)象中快速提取多個(gè)屬性并賦值給多個(gè)變量。例如:

data class User(val name: String, val age: Int)

val user = User("Alice", 25)
val (name, age) = user

println("Name: $name, Age: $age")

在上面的代碼中,我們定義了一個(gè) User 類,并且使用解構(gòu)聲明從 user 對(duì)象中提取了 name 和 age 屬性并分別賦值給了 name 和 age 變量。

對(duì)象表達(dá)式和對(duì)象聲明

在 Kotlin 中,我們可以使用對(duì)象表達(dá)式創(chuàng)建一個(gè)匿名對(duì)象,也可以使用對(duì)象聲明創(chuàng)建一個(gè)單例對(duì)象。例如:

// 對(duì)象表達(dá)式
val obj = object {
    val x = 10
    fun printX() {
        println(x)
    }
}

obj.printX() // 輸出 10

// 對(duì)象聲明
object Singleton {
    fun doSomething() {
        println("Singleton object is doing something.")
    }
}

Singleton.doSomething() // 輸出 "Singleton object is doing something."

在上面的代碼中,我們使用對(duì)象表達(dá)式創(chuàng)建了一個(gè)匿名對(duì)象,并且在這個(gè)對(duì)象中定義了一個(gè) x 屬性和一個(gè) printX() 函數(shù)。我們還使用對(duì)象聲明創(chuàng)建了一個(gè)單例對(duì)象,并且在這個(gè)對(duì)象中定義了一個(gè) doSomething() 函數(shù)。

with 和 apply 函數(shù)

Kotlin 中的 with() 和 apply() 函數(shù)可以用于簡(jiǎn)化某些操作。with() 函數(shù)接收一個(gè)對(duì)象和一個(gè) Lambda 表達(dá)式,可以在 Lambda 表達(dá)式中直接訪問(wèn)對(duì)象的屬性和方法,例如:

val person = Person("Alice", 25)

with(person) {
    name = "Bob"
    age += 1
}

println("Name: ${person.name}, Age: ${person.age}") // 輸出 "Name: Bob, Age: 26"

在上面的代碼中,我們使用 with() 函數(shù)修改了 person 對(duì)象的 name 和 age 屬性。

apply() 函數(shù)和 with() 函數(shù)類似,但是它返回對(duì)象本身,可以使用鏈?zhǔn)秸{(diào)用的方式設(shè)置多個(gè)屬性,例如:

val person = Person("Alice", 25).apply {
    name = "Bob"
    age += 1
}

println("Name: ${person.name}, Age: ${person.age}") // 輸出 "

let語(yǔ)法

let 函數(shù)是一個(gè)非常有用的語(yǔ)法糖,它允許您在一個(gè)對(duì)象上執(zhí)行一個(gè)操作,并返回結(jié)果。這個(gè)操作可以是一個(gè)函數(shù)或一個(gè)代碼塊。let 函數(shù)有以下兩種形式:

  • let { }:執(zhí)行給定的代碼塊,以當(dāng)前對(duì)象作為其參數(shù),并返回結(jié)果。
  • obj.let { }:執(zhí)行給定的代碼塊,以 obj 作為其參數(shù),并返回結(jié)果。 下面是一個(gè)使用 let 函數(shù)的例子,假設(shè)我們有一個(gè)字符串列表,我們想打印列表中所有元素的長(zhǎng)度,但只有在元素不為空時(shí)才打印:
val stringList = listOf("Hello", null, "World", null, "Kotlin")
stringList.filterNotNull().map { it.length }.forEach { println(it) }

這里我們使用了 filterNotNull() 函數(shù)來(lái)過(guò)濾空元素,并使用 map 函數(shù)將非空元素轉(zhuǎn)換為它們的長(zhǎng)度,然后使用 forEach 函數(shù)打印每個(gè)長(zhǎng)度。這個(gè)例子很簡(jiǎn)單,但它可能會(huì)讓代碼變得混亂和難以閱讀。讓我們使用 let 函數(shù)來(lái)重寫(xiě)這個(gè)例子:

val stringList = listOf("Hello", null, "World", null, "Kotlin")
stringList.forEach {
    it?.let { str ->
        println(str.length)
    }
}

在這個(gè)例子中,我們使用 forEach 函數(shù)來(lái)遍歷字符串列表。在每個(gè)元素上調(diào)用 let 函數(shù),如果元素不為空,則打印它的長(zhǎng)度。這個(gè)例子使用了簡(jiǎn)潔的語(yǔ)法,使代碼更易于閱讀和理解。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68521
  • kotlin
    +關(guān)注

    關(guān)注

    0

    文章

    60

    瀏覽量

    4187
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ZZ:口香電池

    `由Ping-Yi Lin帶來(lái)的概念設(shè)計(jì):口香電池(Chewing Gum Battery)。將電池設(shè)計(jì)成一片一片的口香模樣,放入類似自動(dòng)販賣機(jī)的太陽(yáng)能基站給其充電。使用時(shí)只需要依照產(chǎn)品的電壓
    發(fā)表于 10-12 14:46

    果兒洛克王國(guó)輔助 1.02

      1、【洛克王國(guó)輔助】 果兒洛克王國(guó)輔助 1.02  軟件名稱:果兒洛克王國(guó)輔助 1.02   軟件大小: 4.0M  軟件分類: 洛克王國(guó)輔助  軟件語(yǔ)言: 簡(jiǎn)體  運(yùn)行環(huán)鏡: WinXP
    發(fā)表于 02-14 15:17

    drools高級(jí)語(yǔ)法解析

    drools入門(六) - drools高級(jí)語(yǔ)法
    發(fā)表于 09-30 06:27

    求助,官方出的MESH DEMO怎么改成了Kotlin和JAVA混和了?

    對(duì)于我們大多數(shù)搞偏硬件的,一般都是用C的,對(duì)于C++,JAVA有天生的熟悉感,稍微學(xué)習(xí)一下,在官方的基礎(chǔ)上搞個(gè)東西難度不大,但是現(xiàn)在這個(gè)Kotlin是個(gè)什么鬼?語(yǔ)法規(guī)則完全不同了,連分號(hào)都不
    發(fā)表于 09-21 07:31

    分析Kotlin和Java EE的關(guān)系

    本文分析了Kotlin和Java EE的關(guān)系,討論了如何利用Kotlin的運(yùn)算符,可空性和可選項(xiàng)來(lái)優(yōu)化轉(zhuǎn)換的效果。 將Java EE應(yīng)用程序轉(zhuǎn)換為Kotlin開(kāi)始于框架的戰(zhàn)斗,我們成功地超越了
    發(fā)表于 09-28 17:12 ?0次下載
    分析<b class='flag-5'>Kotlin</b>和Java EE的關(guān)系

    Kotlin的概述

    相信很多開(kāi)發(fā)人員,尤其是Android開(kāi)發(fā)者都會(huì)或多或少聽(tīng)說(shuō)過(guò)Kotlin,當(dāng)然如果沒(méi)有聽(tīng)過(guò)或者不熟悉也沒(méi)有關(guān)系。因?yàn)楸酒恼乱约安┛秃笃诘膬?nèi)容會(huì)涉及到很多關(guān)于Kotlin的知識(shí)分享。 在寫(xiě)
    發(fā)表于 09-28 19:48 ?0次下載
    <b class='flag-5'>Kotlin</b>的概述

    Kotlin編程語(yǔ)言現(xiàn)在是Android應(yīng)用程序開(kāi)發(fā)人員的首選語(yǔ)言

    Kotlin 是一門與 Swift 類似的靜態(tài)類型 JVM 語(yǔ)言,由 JetBrains 設(shè)計(jì)開(kāi)發(fā)并開(kāi)源。與 Java 相比,Kotlin語(yǔ)法更簡(jiǎn)潔、更具表達(dá)性,而且提供了更多的特性,比如,高階函數(shù)、操作符重載、字符串模板。
    的頭像 發(fā)表于 05-10 08:49 ?2608次閱讀

    Kotlin實(shí)戰(zhàn)與Android的應(yīng)用筆記詳細(xì)說(shuō)明

    Kotlin語(yǔ)言在Android Studio中應(yīng)用前景廣闊,本文是編者在應(yīng)用開(kāi)發(fā)中查找資料的總結(jié),內(nèi)容主要來(lái)自網(wǎng)絡(luò),讀者可以作為手冊(cè)來(lái)查找并復(fù)制有用的內(nèi)容到自己的應(yīng)用當(dāng)中。 Kotlin語(yǔ)言部分
    發(fā)表于 12-31 08:00 ?0次下載
    <b class='flag-5'>Kotlin</b>實(shí)戰(zhàn)與Android的應(yīng)用筆記詳細(xì)說(shuō)明

    使用Kotlin替代Java重構(gòu)AOSP應(yīng)用

    最佳實(shí)踐,另外則是提供優(yōu)先使用 Kotlin 進(jìn)行應(yīng)用開(kāi)發(fā)的良好范例。Kotlin 之所以具有強(qiáng)大的吸引力,原因之一是其簡(jiǎn)潔的語(yǔ)法,很多情況下用 Kotlin 編寫(xiě)的代碼塊的代碼數(shù)量
    的頭像 發(fā)表于 09-16 09:26 ?1861次閱讀
    使用<b class='flag-5'>Kotlin</b>替代Java重構(gòu)AOSP應(yīng)用

    使用Kotlin構(gòu)建Android應(yīng)用的基礎(chǔ)知識(shí)

    2021 年 10 月,我們發(fā)布了 "使用 Kotlin 構(gòu)建 Android 應(yīng)用的基礎(chǔ)知識(shí)" 課程的最后一個(gè)單元,這是我們推出的免費(fèi)自學(xué)編程課程,致力于幫助沒(méi)有編程經(jīng)驗(yàn)的人
    的頭像 發(fā)表于 03-29 09:20 ?1614次閱讀

    bilisoleil-kotlin Kotlin版仿B站項(xiàng)目

    ./oschina_soft/bilisoleil-kotlin.zip
    發(fā)表于 06-10 14:12 ?0次下載
    bilisoleil-<b class='flag-5'>kotlin</b> <b class='flag-5'>Kotlin</b>版仿B站項(xiàng)目

    將其Android應(yīng)用的Java代碼遷移到Kotlin

    Meta 稱,遷移到 Kotlin 既簡(jiǎn)單又非常復(fù)雜。因?yàn)?Kotlin 的設(shè)計(jì)允許從 Java 進(jìn)行簡(jiǎn)單的轉(zhuǎn)換,并具有經(jīng)過(guò)深思熟慮的互操作性。這種設(shè)計(jì)使 JetBrains 能夠?yàn)殚_(kāi)發(fā)人員社區(qū)提供
    的頭像 發(fā)表于 10-28 15:15 ?725次閱讀

    語(yǔ)法分析-Antlr

    上一節(jié),我們通過(guò)Antlr快速的落地實(shí)現(xiàn)了Token的解析,這一節(jié)我們還是基于Antlr來(lái)實(shí)現(xiàn)語(yǔ)法解析。
    的頭像 發(fā)表于 03-03 10:14 ?675次閱讀
    <b class='flag-5'>語(yǔ)法</b>分析-Antlr

    Android自定義Toast Kotlin

    電子發(fā)燒友網(wǎng)站提供《Android自定義Toast Kotlin.zip》資料免費(fèi)下載
    發(fā)表于 06-16 11:43 ?0次下載
    Android自定義Toast <b class='flag-5'>Kotlin</b>

    由Java改為 Kotlin過(guò)程中遇到的坑

    最近了解了下 Kotlin ,其中的很多語(yǔ)法很有意思,并且可以與 Java 無(wú)縫兼容。故嘗試在一個(gè) SpringBoot 工程上將部分類修改為 Kotlin ,下面記錄了由 Java
    的頭像 發(fā)表于 09-30 16:51 ?809次閱讀
    由Java改為 <b class='flag-5'>Kotlin</b>過(guò)程中遇到的坑
    RM新时代网站-首页