与 Java 不同, Kotlin 明确地区分可变的和不可变的集合(list, set, map, 等等)。可变的集合可以增删改集合元素;而不可变集合也提供了相应的方法,但是指向会创建新的集合,而不是在原来的集合上修改。
Kotlin 的集合都在命名空间 kotlin.collections。
- Arrays
数组通过 arrayOf()
创建。
- Lists
- Maps
和 Java 的一样, 存储键值对。Kotlin 通过 mapOf()
创建 Map。
Kotlin 有 HashMap, LinkedHashMap, TreeMap。
- Sets
LinkedHashSet, HashSet, TreeSet。
- Sequences
Sequences 用于为止大小的集合, 比如从数据库或者文件读取数据,不知道有多少行, 可以认为 Sequences 是一个无尽的 list。
固定大小的Sequences,可以通过 sequenceOf
表达式创建,比如 Array<T>.asSequence
; 未知大小的,可以通过 generateSequence
创建。
val charSequence: Sequence<Char> = charArrayOf('a','b','c').asSequence()
val longsSequence: Sequence<Long> = listOf(12000L, 11L, -1999L).asSequence()
val mapSequence: Sequence<Map.Entry<Int, String>> = mapOf(1 to "A", 2 to "B", 3 to "C").asSequence()
val intSeq = sequenceOf(1, 2, 3, 4, 5)
var nextItem = 0
val sequence = generateSequence {
nextItem += 1
nextItem
}
val secondSequence = generateSequence(100) { if ((it + 1) % 2 == 0) it + 1 else it + 2 }
如下例子, 读取文件内容:
val stream = Thread.currentThread().javaClass.getResourceAsStream("/afile.txt")
val br = BufferedReader(InputStreamReader(stream))
val fileContent = generateSequence { br.readLine() }.takeWhile { it != null }
println("File content:${fileContent.joinToString(" ")}")
参考
《Programming Kotlin》Stephen Samuel ,Stefan Bocutiu
《Kotlin in Action》Dmitry Jemerov,Svetlana Isakova