與 Java 不同, Kotlin 明確地區(qū)分可變的和不可變的集合(list, set, map, 等等)扳躬〈嗨撸可變的集合可以增刪改集合元素;而不可變集合也提供了相應(yīng)的方法贷币,但是指向會(huì)創(chuàng)建新的集合,而不是在原來的集合上修改亏狰。
Kotlin 的集合都在命名空間 kotlin.collections役纹。
- Arrays
數(shù)組通過 arrayOf()
創(chuàng)建。
- Lists
- Maps
和 Java 的一樣暇唾, 存儲(chǔ)鍵值對(duì)促脉。Kotlin 通過 mapOf()
創(chuàng)建 Map。
Kotlin 有 HashMap, LinkedHashMap, TreeMap策州。
- Sets
LinkedHashSet, HashSet, TreeSet瘸味。
- Sequences
Sequences 用于為止大小的集合, 比如從數(shù)據(jù)庫或者文件讀取數(shù)據(jù)够挂,不知道有多少行旁仿, 可以認(rèn)為 Sequences 是一個(gè)無盡的 list。
固定大小的Sequences孽糖,可以通過 sequenceOf
表達(dá)式創(chuàng)建枯冈,比如 Array<T>.asSequence
毅贮; 未知大小的,可以通過 generateSequence
創(chuàng)建尘奏。
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 }
如下例子滩褥, 讀取文件內(nèi)容:
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