在咱們平常處理數據時, Kotlin 中 Collections(集合)是很是好用的數據結構,同時 Kotlin 的標準庫中也實現了很是多的擴展方法,幫助咱們更好的使用 Collections。你也許發現了還有另外一種數據結構 Sequences (序列),它一樣也能夠實現和 Collections 同樣的功能,那麼這兩種數據結構有什麼區別呢?以及咱們什麼時候該使用 Collections,什麼時候該使用 Sequences 呢?今天這篇文章就告訴你。bash
例如,咱們有一個用戶集合,須要找出全部 name 是以 「w「 開頭的用戶,並返回這些用戶的名字集合。那麼咱們可使用 map 和 filter 這兩個操做符來實現咱們的需求。微信
下面是分別使用 Collections 和 Sequences 的兩種實現方式,能夠看到幾乎同樣,Sequences 只是在開始操做以前作了 asSequence() 的操做。數據結構
val uses = arrayListOf(User("1", "wanbo"), User("2", "zhangsan"), User("3", "lisi"))
val result1 = uses.map(User::name).filter { it.startsWith("w") }.toList()
val result2 = uses.asSequence().map(User::name).filter { it.startsWith("w") }.toList()
複製代碼
咱們能夠分別打印下面這兩句代碼,而後找出它們的區別所在。性能
println(uses.map(User::name))
println(uses.asSequence().map(User::name))
// 打印結果
[wanbo, zhangsan, lisi]
kotlin.sequences.TransformingSequence@506e1b77
複製代碼
能夠看出,Collections 在執行 map 操做後,返回了一個新的集合,而 Sequences 返回的是一個 新的 Sequence 對象。spa
結合 Collections 和 Sequences 的定義,咱們能夠得出如下結論。code
Collections:每一次數據操做都是當即執行的,它會把每一步操做後的結果,存儲在一個新的臨時集合中,而後使用這個新集合繼續下一步數據操做。orm
Sequences:每一次數據操做都是延期執行的,它會把每一步變換數據的操做存儲在新的 Sequence 對象中,傳遞給下一個操做。Sequences 有兩種操做:中間操做和末端操做,例如 map 和 filter 都屬於中間操做,而 toList 屬於末端操做。中間操做返回的是一個存儲變換數據操做新序列,而末端操做返回的是一個結果。對象
因此當咱們打印上面的 map 操做時,Sequences 返回的是一個新的 Sequence 對象,也只有當 toList 這個末端操做執行是,纔會觸發全部延期執行的計算操做。內存
那麼這麼作有什麼好處嗎?string
上面👆的例子中只有三條數據,若是咱們有一百萬條數據,使用 Collections 就會變得十分低效,會形成沒必要要的內存開銷。
2. 數據操做執行順序的不一樣
Collections 是將所有數據執行 map 操做,而後返回新的集合去執行 filter 操做。
Sequences 是按順序將全部操做應用到每一條數據上,即:處理完第一條數據(先 map 後 filter),而後再處理第二條數據,以此類推。
例如,咱們仍是上面的數據,需求而後找出第一個 name 以 「w」 開頭的用戶名(不區分大小寫w)。這樣的話,咱們可使用 map 和 first 來實現需求。
val uses = arrayListOf(User("1", "wanbo"), User("2", "zhangsan"), User("3", "lisi"))
val result1 = uses.map { it.name.toUpperCase() }.first { it.startsWith("W") }
val result2 = uses.asSequence().map { it.name.toUpperCase() }.first { it.startsWith("W") }
複製代碼
經過上面的結論咱們可知,Collections 會把全部 name 變成大寫,而後執行 first 操做,而 Sequences 會按數據順序執行,正巧第一個數據就知足,那麼當處理完第一條數據的時候,就直接能夠返回結果了,不須要繼續執行後續操做了。
一樣在擁有不少條數據的時候,Sequences 在執行效率上的表現也是優於 Collections 的。
很簡單,根據數據大小來選擇,若是是輕量級的數據,則使用 Collections,若是是大量級的數據,那麼就使用 Sequences。
另外,涉及到數據的操做,選取合適的數據結構,選用合適的策略都是很是重要的,例如咱們第一個例子,若是是先 filter 後 map 的話,在性能上會有更好的表現,你發現了嗎?🤣,因此在寫代碼以前要多思考,多動腦,才能寫出優良的代碼。
歡迎關注同名微信公衆號【Android丨Kotlin】