Kotlin學習之路(2)數據類型

每一種語言都有自己的基本數據類型,Kotlin也有自己的數據類型,類似與Java包括整型 浮點型 布爾類型等。

今天的學習目錄
在這裏插入圖片描述

【變量】

1)分隔符
Kotlin語言中的分號 花括號({ )} 方擴號( [ ] ) 原點( .)都具有分隔意義。

① 分號與Java語言不同Kotlin不強制要求每條語句必須以分號結尾,如果是一行內寫多個獨立語句,前面的語句需要用分號表示結束。

    var nameC:String = "Hello"; var nameA:String = "Kotlin"

② 花括號的作用就是定義一個代碼塊,一個代碼塊指的就是“{”與“}”包含的一段代碼,代碼塊在邏輯上是一個整體。在Kotlin語言中,類體部分 枚舉 方法體,條件語句中的條件執行體,與循環語句的循環體也都放在代碼塊中。

(2) 標識符的規則

區分大小寫:Myname 與 myname 是兩個不同的標識符。
首字符:可以是下劃線 _ 或字母,但不能是數字。
除首字符外其他字符,可以是下劃線(_)、字母和數字。
硬關鍵字(Hard Keywords)不能作爲標識符,軟關鍵字(Soft Keywords)、修飾符關鍵字(Modifier Keywords)在它們的適用場景之外可以作爲標識符使用。
特定標識符 field 和 it。在 Kotlin 語言中有兩個由編譯器定義的特定標識符,它們只能在特定場景中使用有特定的作用,而在其他的場景中可以做標識符使用。

(3) 關鍵字

硬關鍵字(Hard Keywords),硬關鍵字在任何情況下都不能作爲關鍵字,具體包括如下關鍵字, as、as?、break、class、continue、do、else、false、for、fun、if、in、!in、interface、is、!is、null、object、package、return、super、this、throw、true、try、typealias、val、var、when 和 while。

軟關鍵字(Soft Keywords),軟關鍵字是在它適用場景中不能作爲標識符,而其他場景中可以作爲標識符,具體包括如下關鍵字, by、catch、constructor、delegate、dynamic、field、file、finally、get、import、init、param、property、receiver、set、setparam 和 where。

修飾符關鍵字(Modifier Keywords),修飾符關鍵字是一種特殊的軟關鍵字,它們用來修飾函數、類、接口、參數和屬性等內容,在此場景中不能作爲標識符。而其他場景中可以作爲標識符,具體包括如下關鍵字,abstract、annotation、companion、const、crossinline、data、enum、external、final、infix、inner、internal、lateinit、noinline、open、operator、out、override、private、protected、public、reified、sealed、suspend、tailrec和vararg。

【數據類型】

1)基本數據類型的變量聲明
kotlin基本數據類型包括整型 長整型 浮點型 雙精度 布爾型 字符型 字符串 這幾種常見的數據類型,如下表
在這裏插入圖片描述
看起來是不是跟Java差不多,但是在聲明變量的時候卻與Java不同

Int i = 0   //java寫法 

如果採用Java這種規則來書寫Kotlin代碼,Android Studio肯定在編譯的時候就不能通過,正確的Kotlin寫法

var i:Int = 0

Kotlin聲明語句是“變量名”:“變量類型”,而不是Java常見的“變量類型 變量名”這種格式,在這裏你會驚奇的發現Kotlin與Java正好相反,Kotlin聲明完畢無需分號,直接回車即可。(在分隔符中對分號有介紹,這裏就不詳細的介紹了)

2)數值型之間的類型轉換
與Java一樣不同整型的變量能支持的表數範圍是不同的,比如Byte類型的變量或常量只能接受-128~127之間的整數, Short類型的變量或常量只能接受-32768 ~ 32767之間的整數,如果數值超出這個範圍就會編譯報錯。 簡單來說Kotlin不支持範圍小的數據類型隱式轉爲取值大的類型。在Kotlin中不允許通過Java的前綴表達式來強制轉換類型!
如下表
在這裏插入圖片描述
Kotlin要求不同變量或值之間必須進行顯式轉換,示例如下

    val origin: Float = 65.0f
        origin.toString()

        var int: Int
        int = origin.toInt()
        int.toString()
        LogUtil.printLog(LogUtil.E, "XX1", "原始值 " + origin + "  轉換值 " + int.toString())

        var long: Long
        long = origin.toLong()
        LogUtil.printLog(LogUtil.E, "XX1", "原始值 " + origin + "  轉換值 " + long.toString())

        var float: Float
        float = origin.toDouble().toFloat()
        LogUtil.printLog(LogUtil.E, "XX1", "原始值 " + origin + "  轉換值 " + float.toString())

        var double: Double
        double = origin.toDouble()
        LogUtil.printLog(LogUtil.E, "XX1", "原始值 " + origin + "  轉換值 " + double.toString())

        var char: Char
        char = origin.toChar()
        LogUtil.printLog(LogUtil.E, "XX1", "原始值 " + origin + "  轉換值 " + char.toString())

        var boolean: Boolean
        boolean = origin.isNaN()
        LogUtil.printLog(LogUtil.E, "XX1", "原始值 " + origin + "  轉換值 " + boolean.toString())

截圖如下
在這裏插入圖片描述

【字符串】

1)字符串與基本類型的轉換
字符串轉爲其他類型數據Kotlin與Java方式對比

在這裏插入圖片描述
2)字符串的常用方法
Kotlin方法基本兼容Java相關的方法,比如查找指定位置的字串indexOf方法,截取某指定位置字串的方法substring,或者替換字串的操作所調用的replace,對於特定的字符分割操作split方法。

Kotlin使用indexOf 與substring查找截取字符串的例子

   val origin: Float = 165.0f
        origin.toString()
        var text:String = origin.toString()
        if (text.indexOf(".")>0){
           text = text.substring(0,text.indexOf("."))
        }

split方法的使用,在java中split返回的是Sting數組,但是在Kotlin中split返回的則是Sting類型的隊列,List< String >

 var origin: String = "12345678.90"
        var strList: List<String> = origin.split(".")
        var strRe: String = ""
        for (item in strList) {
            strRe = strRe + item + ","
        }
        LogUtil.printLog(LogUtil.E, "XX0", strRe)


如果想獲取某個位置的字符,如果採用java的方式去實現時卻有些繁瑣,因爲只能調用substring方法去截取字符串的位置

Sting str = orgin.shubstring(number,number+1);

如果採用Kotlin去實現就方便很多,因爲它可以直接通過下標訪問字符串所指定的位置

Sting str = orgin[number].toString()

同時Kotlin也支持字符串變量通過Get的方式來獲取指定位置上的字符

Sting str = orgin.get(number).toString()

3)字符串模板及其拼接

Kotlin允許字符串中嵌套變量或者表達式,我們只要把變量或者表達式放進${ }中就OK了,這樣Kotlin將該變量或表達式的值嵌入到該字符串中

var Price : Double= 88.0
var s = "圖書的價格是:${Price}元"

【數組–暫時先了解】

暫時先了解一下,在【集合】模塊中再詳細講解,先有個大概的瞭解也方便後續的學習

1)數組變量的聲明

在Java中整數數組是這樣聲明並初始化的

int[] int_array = new int[]{1,2,3}

其他數據類型的數組聲明與之類似,我們只要把這個int 換成long float double 即可,但是在Kotlin中這麼玩是不可以的,Kotlin的數組聲明

var int_array:IntArray = intArrayof(1,2,3)

兩者相互對比 Kotlin中提供了新的整型數組類型—IntArray,在分配一個常量數組的時候Kotlin沒有使用關鍵字new,而是調用的intArrayOf方法

        var intArray: IntArray = intArrayOf(1, 2, 3)
        var longArray: LongArray = longArrayOf(1, 2, 3)
        var floatArray: FloatArray = floatArrayOf(1.0f, 2.0f, 3.0f)
        var doubleArray: DoubleArray = doubleArrayOf(1.0, 2.0, 3.0)
        var charArray: CharArray = charArrayOf('a', 'b', 'c')

☆ Kotlin數組類型不包括字符數組,而大家所熟悉的Java是允許使用字符串數組的。

Sting[] sting_array = new Sting[]{"衝","鴨"}

在Kotlin中不存在StingArray的素組類型,因爲Sting是一種特殊的基本數據類型,想要在Kotlin中聲明字符串數組代碼如下

var string_array:Array<Sting> = arrayOf("衝","呀呀呀")

2)數組元素的操作

獲取數組的長度,Java中.length ,而在Kotlin中所使用的則是.size
對於如何獲取指定位置的數組元素,Java通過方括號加下標來獲取,比如intarray[0] 獲取數組中的第一個元素。在Kotlin中也可以通過下標的方式獲取對應的元素,不過Kotlin要比Java多出兩個方法 get set,通過get獲取元素的值,通過set方法修改元素值,感覺就像在操作ArrayList隊列一樣

        var string_array: Array<String> = arrayOf("How", "Are", "You")
        var str: String = ""
        var i: Int = 0
        while (i < string_array.size) {
            str = str + string_array[i] + ","
            i++
        }
        LogUtil.printLog(LogUtil.E, "XXX", str)

【Null 安全】

null安全可以說是Kotlin對Java重大改進之一,這樣可以避免Java編程時候令人厭煩的NullPointErexception。

1)非空類型與可空類型

        var str:String = ""
        var num :Int  = str.toIntOrNull()
        var num :Int?  = str.toIntOrNull()

第二行代碼中的num類型爲Int,第三行代碼num類型爲Int? 。程序執行第二行代碼無法編譯,而第三行代碼能通過編譯。其中Int?就是一個可空類型,這種類型可以接受Int值和null;而Int類型只能接收Int值不能接受null。
☆ 只有可空的變量或常量才能接受null,非空類型的變量或常量不能接受null

        var aStr: String = "kit"
        var bStr: String? = "kitt"
        aStr = null //錯誤 aStr 不接受null
        bStr = null //正確
        //編譯不能通過 不能產生NPE
        LogUtil.printLog(LogUtil.E, "XX0", aStr.length)
        LogUtil.printLog(LogUtil.E, "XX1", bStr.length)

放到IDE中直接標紅,沒辦法編譯,更不能產生NullPointErexception了

2)先判斷後使用

可空類型的變量不允許直接調用方法或者屬性,但是可以先判斷該變量不爲null,然後再調用該變量的方法或者屬性。

  var aStr: String? = "kit"
        //先判斷aStr不爲null,然後再訪問aStr的屬性
        var len = if (aStr != null) aStr.length else -1
        //輸出aStr的長度
        LogUtil.printLog(LogUtil.E, "XX0", "aStr的長度爲$len")
        aStr = null
        if (aStr != null && aStr.length > 0){
            LogUtil.printLog(LogUtil.E, "XX0", "aStr的長度爲${aStr.length}")
        }else{
            LogUtil.printLog(LogUtil.E, "XX0", "字符串爲null")
        }

3)安全調用

Kotlin的安全調用如下

        var b: String? = "kit"
        print(b?.length) //輸出3
        b = null
        print(b?.length) //輸出null

即使是 b=null ,也不會引起NullPointErexception,而是返回null Kotlin安全調用也完全支持鏈式調用

user?.dog?.name

表示獲取user dog name 的屬性,如果user 或者user.dog 爲null 整個表達式返回爲null

4)Elvis運算

Elvis運算也算是一種小技巧,其實也就是if else的簡化

        //先判斷b不爲null,然後訪問 b的lenght屬性
        if (b != null) b.length else -1
        //使用Elvis運算
        var len2 = b?.length?:-1

Elvis的含義如果“?:”左邊表達式不爲null返回左邊表達式的值,否則返回“?:” 右面表達式的值

小結

通過這次學習應該要掌握的技能
(1) 學會Kotlin對數據類型的變量定義以及變量之間的相互轉換
(2) 學會Kotlin對字符串的一些操作
(3) 瞭解Kotlin一些關鍵字,以及標識符的規則
(4) 瞭解各種類型數組的聲明方式以及數組變量常用的方法
(5) 對Kotlin Null 有一定的瞭解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章