Kotlin学习之路(2)数据类型

2021-04-07 15:08:18 浏览数 (1)

每一种语言都有自己的基本数据类型,Kotlin也有自己的数据类型,类似与Java包括整型 浮点型 布尔类型等。

【变量】

1)分隔符 Kotlin语言中的分号 花括号({ )} 方扩号( [ ] ) 原点( .)都具有分隔意义。

① 分号与Java语言不同Kotlin不强制要求每条语句必须以分号结尾,如果是一行内写多个独立语句,前面的语句需要用分号表示结束。

代码语言:javascript复制
    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不同

代码语言:javascript复制
Int i = 0   //java写法 

如果采用Java这种规则来书写Kotlin代码,Android Studio肯定在编译的时候就不能通过,正确的Kotlin写法

代码语言:javascript复制
var i:Int = 0

Kotlin声明语句是“变量名”:“变量类型”,而不是Java常见的“变量类型 变量名”这种格式,在这里你会惊奇的发现Kotlin与Java正好相反,Kotlin声明完毕无需分号,直接回车即可。(在分隔符中对分号有介绍,这里就不详细的介绍了)

2)数值型之间的类型转换 与Java一样不同整型的变量能支持的表数范围是不同的,比如Byte类型的变量或常量只能接受-128~127之间的整数, Short类型的变量或常量只能接受-32768 ~ 32767之间的整数,如果数值超出这个范围就会编译报错。 简单来说Kotlin不支持范围小的数据类型隐式转为取值大的类型。在Kotlin中不允许通过Java的前缀表达式来强制转换类型! 如下表

Kotlin要求不同变量或值之间必须进行显式转换,示例如下

代码语言:javascript复制
    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查找截取字符串的例子

代码语言:javascript复制
   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 >

代码语言:javascript复制
 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方法去截取字符串的位置

代码语言:javascript复制
Sting str = orgin.shubstring(number,number 1);

如果采用Kotlin去实现就方便很多,因为它可以直接通过下标访问字符串所指定的位置

代码语言:javascript复制
Sting str = orgin[number].toString()

同时Kotlin也支持字符串变量通过Get的方式来获取指定位置上的字符

代码语言:javascript复制
Sting str = orgin.get(number).toString()

3)字符串模板及其拼接

Kotlin允许字符串中嵌套变量或者表达式,我们只要把变量或者表达式放进${ }中就OK了,这样Kotlin将该变量或表达式的值嵌入到该字符串中

代码语言:javascript复制
var Price : Double= 88.0
var s = "图书的价格是:${Price}元"

【数组–暂时先了解】

暂时先了解一下,在【集合】模块中再详细讲解,先有个大概的了解也方便后续的学习

1)数组变量的声明

在Java中整数数组是这样声明并初始化的

代码语言:javascript复制
int[] int_array = new int[]{1,2,3}

其他数据类型的数组声明与之类似,我们只要把这个int 换成long float double 即可,但是在Kotlin中这么玩是不可以的,Kotlin的数组声明

代码语言:javascript复制
var int_array:IntArray = intArrayof(1,2,3)

两者相互对比 Kotlin中提供了新的整型数组类型—IntArray,在分配一个常量数组的时候Kotlin没有使用关键字new,而是调用的intArrayOf方法

代码语言:javascript复制
        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是允许使用字符串数组的。

代码语言:javascript复制
Sting[] sting_array = new Sting[]{"冲","鸭"}

在Kotlin中不存在StingArray的素组类型,因为Sting是一种特殊的基本数据类型,想要在Kotlin中声明字符串数组代码如下

代码语言:javascript复制
var string_array:Array<Sting> = arrayOf("冲","呀呀呀")

2)数组元素的操作

获取数组的长度,Java中.length ,而在Kotlin中所使用的则是.size 对于如何获取指定位置的数组元素,Java通过方括号加下标来获取,比如intarray[0] 获取数组中的第一个元素。在Kotlin中也可以通过下标的方式获取对应的元素,不过Kotlin要比Java多出两个方法 get set,通过get获取元素的值,通过set方法修改元素值,感觉就像在操作ArrayList队列一样

代码语言:javascript复制
        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)非空类型与可空类型

代码语言:javascript复制
        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

代码语言:javascript复制
        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,然后再调用该变量的方法或者属性。

代码语言:javascript复制
  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的安全调用如下

代码语言:javascript复制
        var b: String? = "kit"
        print(b?.length) //输出3
        b = null
        print(b?.length) //输出null

即使是 b=null ,也不会引起NullPointErexception,而是返回null Kotlin安全调用也完全支持链式调用

代码语言:javascript复制
user?.dog?.name

表示获取user dog name 的属性,如果user 或者user.dog 为null 整个表达式返回为null

4)Elvis运算

Elvis运算也算是一种小技巧,其实也就是if else的简化

代码语言:javascript复制
        //先判断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 有一定的了解

0 人点赞