Kotlin基础七

377 阅读6分钟

内容

  • Kotlin中数据类型
  • Kotlin中数字转换
  • Kotlin中的Any类型
  • Kotlin中的Unit类型
  • Kotlin中的Nothing类型
  • 集合泛型的可空性和集合的可空性比较
  • 可变集合和不可变集合
  • java集合到kotlin中将会变成平台集合
  • Kotlin中的数组

一Kotlin中的数据类型

kotlin中数据类型有:整数类型:Byte,Short,Int,Long小数类型:Float,Double字符类型:Char布尔类型:Boolean。

java中八种基本数据类型对应的有八种包装类型,这是因为java中基本类型不能调用方法,所以提供了包装类型(这个和存储的地方不一样导致的这种结果)。

区别:Kotlin中没有对应的八中包装类型,是因为Kotlin在编译时期自动做了转换,而且基本类型也可以调用方法。

注意:Kotlin中的可空类型不能用Java的基本数据类型表示,因为null只能被存储在Java的引用类型的变量中。

二Kotlin中的数字转换

2.1数字之间转换

我们知道java中的数字类型都有范围,并且小范围向大范围之间会自动转换。同样的Kotlin中的数字类型也有范围,范围和java中的范围一致,不同的是,Kotlin中的范围不能自动转换,必须显示的调用他们内部提供的转换的方法。如

var a :Int = 1
var b :Long = a.toLong()

必须显示的调用toLong方法,否则编译不通过。

延伸:写16进制的数,用0x开头;书写8进制的数,用0b开头;书写Float类型,后边加上f。

注意,Kotiin算术运算符关于数值范围溢出的行为和Java完全一致。
2.2字符串和数字之间转换
            Kotlin标准库提供了一套相似的扩展方法,用来把字符串转换成基本数据类型(toint、toByte、toBoolean等),每个这样的函数都会尝试把字符串的内容解析成对应的类型,如果解析失败则抛出NumberFormatException。

三kotlin中的Any类型

在java中所有引用类型的父类都是object,而基本数据类型的父类却不是object。同样的在kotlin中,基本数据类型和引用类型的父类全部是Any。本质是基本类型在编译的时候会自动装箱。所以Kotlin中Any就是我们java中的Object类型。

注意:在kotlin中想要声明一个变量可以是任何数,包括null,我们需要把类型写成Any?

四.Kotlin中的Unit类型

Kotlin中的Unit类型完成了Java中的void一样的功能。有一点差别:java中只要返回值不是void,就必须有return,而Kotlin中只要return是unit,就可以不写。

五Kotlin中的Nothing类型

我也不知道这个四干什么的,反正直到有这个类型就行了。

六集合泛型的可空性和集合的可空性比较

在Kotlin中集合的可空性和集合泛型的可空性是完全不一样的概念,如下边代码:

var list1 = ArrayList<Int?>()
var list2: ArrayList<Int>? = ArrayList()

list1表示集合里边可以储存null值,而集合不能为null

list2表示集合可以为null,但是集合里边不能储存null值

遍历一个包含可空值的集合并过滤掉null是个非常常见的操作,Kotlin给我们提供了简便的过滤方法: list.filterNotNull(),返回的是一个新的类型,即:ArrayList<Int>

七可变集合和不可变集合

我们直到java中没有单独的创建一个可变集合和不可变集合,而对于Kotlin丰富的这一功能。因为他是用不同接口平行分离处理:看下边代码:

val arr1: Collection<Int> = arrayListOf(1, 2, 3)

arr1集合是一个不可变集合,因为我们在集合前边显示的声明了这个集合是不可变集合,它没有add方法。

val arr2: MutableCollection<Int> =arrayListOf(1, 2, 3)

arr2集合是一个可变集合,因为我们在集合前边显示的声明了这个集合是可变集合,它有add方法。

val arr3: MutableCollection<Int> = arr1 as MutableCollection<Int>

这行代码是不可变集合可以向可变集合进行转化。

注意:这些可变性可不可变性的定义完全是Kotlin自己定义的,对于和java互掉,他完全控制不了,例如我们写一个java工具类,向集合中添加一个元素:

#java代码

public class Utils {

    public static void arradd4(Collection<Integer> arr) {

        arr.add(4);

    }
}

同时我们在Kotlin中去调用这个方法,

val arr1: Collection<Int> = arrayListOf(1, 2, 3)
Utils.arradd4(arr1)
for (a in arr1){
    Log.e("rrrrr","${a}")
}

打印发现已经添加进去,和你声明可变不可变对于java代码没有影响,因为这是Kotlin为了更好的可读性,自己区分出来的可变集合和不可变集合的概念。

八平台集合类型

同java中的属性到kotlin中变成平台属性一样,java中的集合到kotlin中也会变成平台集合,这个时候你自己需要注意这些检查:

  1. 传递过来的集合对象是否为null
  2. 集合里边的内容是不是null
  3. 集合到底是可变的还是不可变的

九关于数组

数组的创建:

var arr = Array<String>(10) { i -> i.toString() }
var arr4 = arrayOf(1,2,3,4,5,6,7,8,9,10)

他们会被转换成包装类型,这样会降低效率,我们怎么去创建基本类型的数组呢?

为了表示基本数据类型的数组,Kotiin提供了若干独立的类,每一种基本数据类型都对应一个。例如,Int类型值的数组叫作IntArray。Kotlin还提供了ByteArray、CharArray、BooleanArray等给其他类型。所有这些类型都被编译成普通的Java基本数据类型数组,比如
int[]、byte[]、char[]等。因此这些数组中的值存储时并没有装箱,而是使用了可能的最高效的方式。基本类型数组的创建写法:
var arr5  = intArrayOf(1,2,3,4,5)
var arr6 = IntArray(100){i->i}

同时数组拥有所有操作集合的操作符,如forEach,filter,map等

同时集合中都提供转换成数组的方法toxxxArray()。

小结:

Kotlin中只有八中基本数据类型,且都可以调用方法

Kotlin中的数字类型之间转换必须要显示的调用方法

Kotlin中的Any类型相当于java中的Object类型

Kotlin中的Unit类型相当于java中的void类型

Kotlin中的集合自己区分了可变类型和不可变类型,对于传递给java没有约束力

java中的集合在Kotlin中会变成平台集合,需要开发者自己考虑可读还是可写,集合是否为null,集合里边的内容是否为null

Kotlin中的数组的两种集合声明方法:Array<Int>(长度){值},arrayOf(值),他们都会编译成包装类型,

Kotlin中声明基本类型的数组,例如:intArrayof(内容),IntArray(长度){内容},他们效率更高

Kotlin中的数组拥有所有集合的中扩展方法,操作起来比java中操作数组方便很多

Kotlin中集合中都会有转换成基本类型的数组的方法:例如toIntArray()