日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Kotlin——初级篇(六):空类型、空安全、非空断言、类型转换等特性总结

發(fā)布時(shí)間:2025/7/14 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kotlin——初级篇(六):空类型、空安全、非空断言、类型转换等特性总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在我們熟知的Java中,定義一個(gè)變量可以默認(rèn)不賦值,因?yàn)镴ava的系統(tǒng)會(huì)給我們默認(rèn)賦一個(gè)默認(rèn)值,并且Java可定義一個(gè)賦值為null的變量,這樣在使用這個(gè)變量的時(shí)候都會(huì)去顯示判斷該變量是否為null。從代碼的簡潔性以及代碼的閱讀性來說,就差了Koltin一籌了,那么Kotlin定義一個(gè)變量可為null的變量怎么定義呢?下面針對(duì)Kotlin的這些特性,作出一個(gè)詳細(xì)的講解。

目錄

一、可空類型、空安全

在前面的變量、常量中我們已經(jīng)講解到了變量的定義。這里不作詳述。若你有興趣,請(qǐng)參見Kotlin——初級(jí)篇(二):變量、常量、注釋

1.1、定義一個(gè)可空類型的變量

定義一個(gè)可空類型的變量的格式為:修飾符 變量名 : 類型? = 值

這里為了演示,定義變量和定義可空變量的區(qū)別,會(huì)提到定義變量的代碼。

例:

// 定義一個(gè)不可為空的變量,用var修飾的變量可以被重新賦值,用val修飾的變量則不能,但是不能賦值為null var a : Int = 12 val b : Int = 13a = 20 // a = null 不能復(fù)制為null // b = 20 不能被重新賦值if(a == null){// 這樣的判斷毫無意義,因?yàn)樽兞縜永遠(yuǎn)不可能null }/*定義可空類型的變量,即變量可以被賦值為null定義格式為:修飾符 變量名 : 類型? = 值 */ var nullA : Int? = 12 val nullB : Int? = 13nullA = nullif(nullA == null){println("nullA = $nullA") }

可以看出:變量 nullA 的值為 null

分析:要定義一個(gè)可空類型的變量時(shí),即在定義變量的類型后面加上?符號(hào)就行了。在使用的時(shí)候,記住要判斷該段該變量是否為空,這個(gè)操作在Java中經(jīng)常會(huì)用到...,如果定義一個(gè)不可為空類型的變量時(shí),則判斷將毫無意義,因?yàn)檫@個(gè)變量永遠(yuǎn)不會(huì)為空。

1.2、判斷可空類型的兩種使用方式

在上面我們提到,可空類型需要判斷在使用,這里介紹除了if ... else...之外的其他方式

1.2.1、if...else...判斷

例:

var str : String? = "123456" str = nullif (str == null){println("變量str為空") }else{println("str.length => ${str.length}") }

輸出結(jié)果為:

變量str為空

1.2.2、使用符號(hào)?.判斷

  • 該符號(hào)的用法為:可空類型變量?.屬性/方法。如果可空類型變量為null時(shí),返回null
  • 這種用法大量用于鏈?zhǔn)讲僮?/strong>的用法中,能有效避免空引用異常(NullPointException),因?yàn)橹灰準(zhǔn)狡渲械囊粋€(gè)為null,則整個(gè)表達(dá)式都為null

例:

var str : String? = "123456" str = nullprintln(str?.length) // 當(dāng)變量str為null時(shí),會(huì)返回空(null)

輸出結(jié)果為:

null

1.2.3、鏈?zhǔn)秸{(diào)用

?.這種符號(hào)去判斷是否為null,在Kotlin中使用的地方是很多,特別是對(duì)于鏈?zhǔn)秸{(diào)用來說體驗(yàn)性更好。

例:這里簡單寫一個(gè)建造者模式,來模擬?.在鏈?zhǔn)秸{(diào)用中的用法

class Test{class Builder{private var name : String? = "Tom"private var age : Int? = 0private var sex : String? = "男"fun setName(name : String) : Builder?{this.name = namereturn this}fun setAge(age : Int) : Builder?{this.age = agereturn this}fun setSex(sex: String?) : Builder?{this.sex = sexreturn this}override fun toString(): String {return "Builder(name=$name, age=$age, sex=$sex)"}} }fun main(args: Array<String>) {val builder : Test.Builder? = Test.Builder().setName("Lily")?.setSex("nv")?.setAge(10)println(builder.toString()) }

輸出結(jié)果為:

Builder(name=Lily, age=10, sex=女)

如果你上面的代碼看不懂可以看下的代碼,你可以看下面的例子:頂一個(gè)可空類型的字符串的長度加5再減去10

val testStr : String? = null val result = testStr?.length?.plus(5)?.minus(10) println(result)

可以看出輸出結(jié)果為: null

1.2.4、函數(shù)中使用可空類型的情況下

當(dāng)一個(gè)函數(shù)/方法有返回值時(shí),如果方法中的代碼使用?.去返回一個(gè)值,那么方法的返回值的類型后面也要加上?符號(hào)

例:

fun funNullMethod() : Int? {val str : String? = "123456"return str?.length }

輸出結(jié)果為:

6

1.2.5、let操作符

  • let操作符的作用:當(dāng)時(shí)用符號(hào)?.驗(yàn)證的時(shí)候忽略掉null
  • let的用法:變量?.let{ ... }

例:排除掉數(shù)組中的空元素

val arrTest : Array<Int?> = arrayOf(1,2,null,3,null,5,6,null)// 傳統(tǒng)寫法 for (index in arrTest) {if (index == null){continue}println("index => $index") }// let寫法 for (index in arrTest) {index?.let { println("index => $it") } }

輸出結(jié)果為:

index => 1 index => 2 index => 3 index => 5 index => 6

注意:上面的兩種寫法的效果是相同的,可以看出使用let{}高階函數(shù)減少了好幾行代碼

Evils操作符

Evils其實(shí)不是一個(gè)操作符,而是evil的復(fù)數(shù),而evil的意思在這里可以理解為屏蔽、安全的操作符,這樣的操作符有三種:

  • ?: 這個(gè)操作符表示在判斷一個(gè)可空類型時(shí),會(huì)返回一個(gè)我們自己設(shè)定好的默認(rèn)值.
  • !! 這個(gè)操作符表示在判斷一個(gè)可空類型時(shí),會(huì)顯示的拋出空引用異常(NullPointException).
  • as? 這個(gè)操作符表示為安全的類型轉(zhuǎn)換.
  • 2.1、?:操作符

    當(dāng)我們定義了一個(gè)可空類型的變量時(shí),如果該變量不為空,則使用,反之使用另外一個(gè)不為空的值

    例:

    val testStr : String? = nullvar length = 0// 例: 當(dāng)testStr不為空時(shí),輸出其長度,反之輸出-1// 傳統(tǒng)寫法 length = if (testStr != null) testStr.length else -1// ?: 寫法 length = testStr?.length ?: -1println(length)

    輸出結(jié)果為:

    -1

    分析:此操作符一般和?.操作符連用。當(dāng)且僅當(dāng)?:左邊的表達(dá)式為null時(shí),才會(huì)執(zhí)行?:右邊的表達(dá)式。

    2.2、!!操作符

    !!操作符可謂是給愛好空引用異常(NullPointException)的開發(fā)者使用,因?yàn)樵谑褂靡粋€(gè)可空類型變量時(shí),在該變量后面加上!!操作符,會(huì)顯示的拋出NullPointException異常

    例:

    val testStr : String? = null println(testStr!!.length)

    輸出結(jié)果為:

    可以看出,在未做空判斷的情況下直接使用操作符!!的情況下,拋出了空異常

    2.3、as?操作符

    其實(shí)這里是指as操作符,表示類型轉(zhuǎn)換,如果不能正常轉(zhuǎn)換的情況下使用as?操作符。當(dāng)使用as操作符的使用不能正常的轉(zhuǎn)換的情況下會(huì)拋出類型轉(zhuǎn)換(ClassCastException)異常,而使用as?操作符則會(huì)返回null,但是不會(huì)拋出異常

    2.3.1、使用as

    例:

    // 會(huì)拋出ClassCastException異常 val num1 : Int? = "Koltin" as Int println("nun1 = $num1")

    輸出結(jié)果為:

    2.3.2、使用as?

    例:

    val num2 : Int? = "Koltin" as? Int println("nun2 = $num2)

    輸出結(jié)果為:

    num2 = null

    總結(jié)

    這一章在實(shí)際的項(xiàng)目開發(fā)當(dāng)中用到的地方是很多的,如果用好了各種空安全的操作符,估計(jì)你的項(xiàng)目中就不會(huì)拋出以及異常了,在這里我做了一個(gè)總結(jié),希望會(huì)對(duì)各位有所幫助:

    • 項(xiàng)目中會(huì)拋出空引用(NullPointerException)異常的情況

    • 在可空類型變量的使用時(shí),用了!!操作符
    • 顯式拋出空引用異常 throw NullPointerException()
    • 外部 Java 代碼導(dǎo)致的
    • 對(duì)于初始化,有一些數(shù)據(jù)不一致(如一個(gè)未初始化的 this 用于構(gòu)造函數(shù)的某個(gè)地方)
    • 項(xiàng)目中會(huì)拋出類型轉(zhuǎn)換(ClassCastException)異常的情況

    • 在類型轉(zhuǎn)換中使用了as操作符
    • 使用了toXXX()方法不能轉(zhuǎn)換的情況下
    • 外部 Java 代碼導(dǎo)致的
    • 盡量避免使用的操作符

    • 盡可能的不要使用!!操作符,多使用?:、?.操作符,以及l(fā)et{}函數(shù)
    • 盡可能的使用as?操作符去替換掉as,在不確定是否可以安全轉(zhuǎn)換的情況下不使用toXXX()方法

    源代碼

    如果各位大佬看了之后感覺還闊以,就請(qǐng)各位大佬隨便star一下,您的關(guān)注是我最大的動(dòng)力。
    我的個(gè)人博客:Jetictors
    我的github:Jetictors
    我的掘金:Jetictors


    歡迎各位大佬進(jìn)群共同研究、探索

    QQ群號(hào):497071402

    參考

    Kotlin 空安全
    Koltin官網(wǎng)文檔

    轉(zhuǎn)載于:https://www.cnblogs.com/Jetictors/p/8292098.html

    總結(jié)

    以上是生活随笔為你收集整理的Kotlin——初级篇(六):空类型、空安全、非空断言、类型转换等特性总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。