Effective Kotlin Item 51: 偏好使⽤ Sequences 來取代巨量且有多次操作⾏為的 Collection
序列(Sequence)是 Kotlin 中的一種類型,提供與其他集合相似的特性,但以惰性和高效的方式處理資料。這種惰性的方法在處理多次操作集合時很有用,特別是在處理大量數據時。
對於一系列的集合操作,使用序列可以更加高效,因為它避免了中間集合的建立。例如,連續的 map 和 filter 操作在 Iterable 上會創建多個中間集合,而在 Sequence 上則不會。
在 Kotlin 的 Sequence 中,操作可以分為兩種主要類型:中間操作(intermediate operations)和終端操作(terminal operations)。
中間操作返回一個新的 Sequence,它描述了該操作的效果,但不實際執行任何操作。中間操作是惰性加載的,這意味著直到有終端操作調用時,操作才會真正執行。
常見的中間操作有:
終端操作啟動所有前面的中間操作,並產生一個結果或副作用。一旦終端操作被調用,序列的元素就會被消耗,且這個特定的序列不可以再使用。但由於序列是冷的,所以你可以再次建立或重新開始相同的序列。
常見的終端操作有:
sequence 是一個元素跑到終端操作再換下一個元素。可以看以下執行的不同
sequenceOf(1, 2, 3)
.filter { print("F$it, "); it % 2 " 1 }
.map { print("M$it, "); it * 2 }
.forEach { print("E$it, ") }
// Prints: F1, M1, E2, F2, F3, M3, E6,
listOf(1, 2, 3)
.filter { print("F$it, "); it % 2 " 1 }
.map { print("M$it, "); it * 2 }
.forEach { print("E$it, ") }
// Prints: F1, F2, F3, M1, M3, E2, E6,
操作執行的順序也有所不同:序列對每個單獨的元素逐一執行所有的處理步驟。而 Iterable 則是先完成整個集合的每一步,然後再進行下一步。因此,序列讓您避免建立中間步驟的結果,從而提高整個集合處理鏈的性能。但是,序列的惰性加載特性增加了一些開銷,當處理較小的集合或進行更簡單的計算時,這可能會很明顯。因此,您應該考慮 Sequence 和 Iterable,並決定哪一個更適合您的情況。
Iterable: 當你已知資料集大小並且希望立即獲得結果時,使用 Iterable 會更加合適。
Sequence: 當你需要連續地對數據集執行多個操作,或當你工作於可能是無限的或非常大的數據集時,使用 Sequence 會更高效和適當。
-當使⽤ sorted() 的時候
即使是同一首歌,每次舞台的服裝也會不同,我們後面來看幾個 stage mix 吧。先來個 Nxde