集合操作概覽
Kotlin 標準函式庫提供了多種多樣的函式,用於對集合執行操作。這包括簡單的操作,例如取得或新增元素,以及更複雜的操作,包括搜尋、排序、過濾、轉換等等。
擴充函式和成員函式
集合操作在標準函式庫中以兩種方式宣告:集合介面的成員函式和擴充函式。
成員函式定義了對集合類型至關重要的操作。例如,Collection
包含了用於檢查其是否為空的 isEmpty()
函式;List
包含了用於索引存取元素的 get()
函式等等。
當您建立自己的集合介面實作時,您必須實作其成員函式。為了讓建立新的實作更容易,請使用標準函式庫中集合介面的骨架實作:AbstractCollection
、AbstractList
、AbstractSet
、AbstractMap
,以及它們對應的可變版本。
其他集合操作則宣告為擴充函式。這些是過濾、轉換、排序以及其他集合處理函式。
常見操作
常見操作同時適用於唯讀集合和可變集合。常見操作分為以下幾類:
這些頁面描述的操作會返回其結果,而不會影響原始集合。例如,過濾操作會產生一個_新集合_,其中包含所有符合過濾條件的元素。此類操作的結果應該儲存在變數中,或以其他方式使用,例如作為參數傳遞給其他函式。
fun main() {
val numbers = listOf("one", "two", "three", "four")
numbers.filter { it.length > 3 } // nothing happens with `numbers`, result is lost
println("numbers are still $numbers")
val longerThan3 = numbers.filter { it.length > 3 } // result is stored in `longerThan3`
println("numbers longer than 3 chars are $longerThan3")
}
對於某些集合操作,有一個選項可以指定_目標_物件。目標是一個可變集合,函式會將其結果項目附加到其中,而不是在新的物件中返回它們。為了執行帶有目標的操作,有獨立的函式,其名稱帶有 To
後綴,例如 filterTo()
而不是 filter()
,或 associateTo()
而不是 associate()
。這些函式將目標集合作為一個額外參數。
fun main() {
val numbers = listOf("one", "two", "three", "four")
val filterResults = mutableListOf<String>() //destination object
numbers.filterTo(filterResults) { it.length > 3 }
numbers.filterIndexedTo(filterResults) { index, _ -> index == 0 }
println(filterResults) // contains results of both operations
}
為了方便起見,這些函式會返回目標集合,這樣您就可以在函式呼叫的相應參數中直接建立它:
fun main() {
val numbers = listOf("one", "two", "three", "four")
// filter numbers right into a new hash set,
// thus eliminating duplicates in the result
val result = numbers.mapTo(HashSet()) { it.length }
println("distinct item lengths are $result")
}
帶有目標的函式可用於過濾、關聯、分組、平坦化以及其他操作。如需目標操作的完整列表,請參閱 Kotlin 集合參考資料。
寫入操作
對於可變集合,也有會改變集合狀態的_寫入操作_。此類操作包括新增、移除和更新元素。寫入操作列在 寫入操作 以及 列表特定操作 和 映射特定操作 的相應部分中。
對於某些操作,有成對的函式用於執行相同的操作:其中一個原地應用操作,而另一個則將結果作為一個獨立的集合返回。例如,sort()
原地排序一個可變集合,因此其狀態會改變;sorted()
建立一個新集合,其中包含相同元素,但已按排序順序排列。
fun main() {
val numbers = mutableListOf("one", "two", "three", "four")
val sortedNumbers = numbers.sorted()
println(numbers == sortedNumbers) // false
numbers.sort()
println(numbers == sortedNumbers) // true
}