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:安全
在第一种状况下,列表自己始终不为null,但列表中的每一个值均可觉得null。第二种类型的变量可能包含空引用而不是列表实例,但列表中的元素保证是非空的。markdown
Kotlin提供了一个标准库函数***filterNotNull
***:遍历一个包含可空值的集合并过滤掉null。多线程
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 |
要在Kotlin中建立数组,有下面这些方法供你选择:设计
arrayOf
函数建立一个数组,它包含的元素是指定为该函数的实参;arrayOfNulls
建立一个给定大小的数组,包含的是null元素。固然,它只能用来建立包含元素类型可空的数组**。Array
*构造方法接受数组的大小和一个lambda表达式,调用lambda表达式来建立每个数组元素。这就是使用非空元素类型来初始化数组,但不能显示地传递每一个元素的方式。为了表示基本数据类型的数组,Kotlin提供了若干独立的类,每一种基本数据类型都对应一个。如,Int
类型值的数组叫作IntArray
。Kotlin还提供了***ByteArray、CharArray、BooleanArray
等给其余类型。全部这些类型都被编译成普通的Java基本数据类型数组,好比int[]、byte[]、char[]
***等
要建立一个基本数据类型的数组,你有以下选择
size
参数并返回一个使用对应基本数据类型默认值*(一般是0)初始化号的数组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
复制代码