Kotlin基础知识(十二)——基本数据类型和其余数据类型

1、可空性和集合

  • 建立一个包含可空值的集合
fun readNumbers(reader: BufferedReader): List<Int?> {
    // 建立包含可空Int值的列表
    val result = ArrayList<Int?>()
    for (line in reader.linesSequence()) {
        try {
            // 向列表添加整数(非空值)
            val number = line.toInt()
            result.add(number)
        }
        catch(e: NumberFormatException) {
            // 向列表添加null,由于当前行不能被解析为整数
            result.add(null)
        }
    }
    return result
}
复制代码

List<Int?>是能持有Int?类型值的列表:换句话说,能够持有Int或者null数组

注意:变量本身类型的可空性和用做类型参数的类型的可空性是有区别的。包括可空Int的列表和包含Int的可空列表之间的区别如图1:安全

图1 集合的元素和集合自己可空性

在第一种状况下,列表自己始终不为null,但列表中的每一个值均可觉得null。第二种类型的变量可能包含空引用而不是列表实例,但列表中的元素保证是非空的markdown

Kotlin提供了一个标准库函数***filterNotNull***:遍历一个包含可空值的集合并过滤掉null。多线程

2、只读集合与可变集合

Kotlin的集合设计和Java不一样的另外一项重要特质是,它把访问集合数据的接口和修改集合数据的接口分开了。这种区别存在于最基础的使用集合的接口之中:kotlin.collections.Collection。使用这个接口,能够遍历集合中的元素、获取集合大小、判断集合中包含某个元素,以及执行其余从该集合中读取数据的操做。但这个接口没有任何添加或移除元素的方法。函数

使用***kotlin.collections.MutableCollection接口能够修改集合中的数据。它继承了普通的kotlin.collections.Collection*接口,还提供了方法来添加和移除元素、清空元素**等。测试

  • 只读集合:函数接受***Collection而不是MutableCollection做为形参,只能读取数据*。
  • 可变集合:函数要求接受***MutableCollection形参,则是能够修改数据*。
// 定义
fun <T> copyElements(source: Collection<T>, target: MutableCollection<T>) {
    // 在source集合中的全部元素中循环
    for(item in source) {
        target.add(item)
    }
}

// 测试
>>> val source: Collection<Int> = arrayListOf(3, 5, 7)
>>> val target: MutableCollection<Int> = arrayListOf(1)
>>> copyElements(source, target)
>>> println(target)
[1, 3, 5, 7]
复制代码

注意:只读集合不必定是不可变的。由于它可能只是同一个集合的众多引用中的一个。任何其余的引用均可能拥有一个可变接口类型。ui

只读集合老是线程安全的。若是你在多线程环境下处理数据,须要保证代码正确地同步了对数据的访问。spa


集合建立函数线程

集合类型 只读 可变
List listOf mutableListOf、arrayListOf
Set SetOf mutableSetOf、hashSetOf、LinkedSetOf、sortedSetOf
Map mapOf mutableMapOf、hashMapOf、LinkedMapOf、sortedMapOf

4、对象和基本数据类型的数组

要在Kotlin中建立数组,有下面这些方法供你选择:设计

  • **arrayOf函数建立一个数组,它包含的元素是指定为该函数的实参
  • arrayOfNulls建立一个给定大小的数组,包含的是null元素。固然,它只能用来建立包含元素类型可空的数组**。
  • *Array*构造方法接受数组的大小和一个lambda表达式,调用lambda表达式来建立每个数组元素。这就是使用非空元素类型初始化数组,但不能显示地传递每一个元素的方式。

为了表示基本数据类型的数组,Kotlin提供了若干独立的类,每一种基本数据类型都对应一个。如,Int类型值的数组叫作IntArray。Kotlin还提供了***ByteArray、CharArray、BooleanArray等给其余类型。全部这些类型都被编译成普通的Java基本数据类型数组,好比int[]、byte[]、char[]***等


要建立一个基本数据类型的数组,你有以下选择

  • 该类型的构造方法接受***size参数并返回一个使用对应基本数据类型默认值*(一般是0)初始化号的数组
  • 厂函数(IntArray的intArrayOf,以及其余数据类型的函数)接受变长参数的值并建立存储这些值的数组
  • 另外一种构造方法,接受一个大小和一个用于初始化每一个元素的lambda
val fiveZeros = IntArray(5)
val fiveZwrosToo = intArrayOf(0, 0, 0, 0, 0)

>>> val squares = IntArray(5) { i -> (i + 1) * (i + 1) }
>>> println(squares.joinToString())
1, 4, 9, 16, 25
复制代码
相关文章
相关标签/搜索