Sequences in Kotlin
Sequences 是 Kotlin 的 Collection 之一,但 Sequences 跟 一般 Collection 中間處理的過程有些許不同,本篇文章會針對下面幾個重點,讓讀者快速了解 Sequences 的特性 及 Sequences 和 一般 Collection (etc: list, set, or map)的差異之處。
Outline
- lazy evaluation V.S. eager evaluation ,Sequences 和 一般 Collection (etc: list, set, or map)的差異之處
- 如何產生一個 Sequences ?
- Sequences 特性 (without a terminal operation ,the output will be empty and all the intermediate operations will be not performed)
lazy evaluation V.S. eager evaluation
Sequences 跟 一般的 Collection 不同之處在於,Sequences 是目標導向,他是以 “必要的情況” 來決定執行過程(lazy evaluation),些許情形下, 並未全部的元素都執行過,就已經有結果輸出了。而 一般的 Collection則會老老實實的每個元素都跑過(eager evaluation),再將結果產出。
在中間的過程, Collection 當呼叫一個運算符,會把所有集合內的資料都跑過一遍(就算這個元素在結果完全沒有用到)之後,產生一個新的資料集合來交棒給下一個呼叫的運算符做處理,一直到產出最終的資料,因此 Collection 在過程中會產生多個 新的資料集合。
如下所示
而 Sequences 在過程中,並不會產生任何的新集合,他的做法是一個元素一個元素處理,依運算符調用順序處理完一個元素再換下一個元素。 直到產生結果,後面的元素就不會再被執行。
如下所示
如何產生一個 Sequences ?
sequenceOf()
調用這個 function 會依傳入的資料,直接產生一個 Sequences
asSequence()
調用這個 function 會 將 現有的 list 轉成 Sequences,再進行相關操作。
generateSequence(){}
調用這個 function ,需指定第一個元素,並基於後面的 {} ,創建 下一個元素,儘管看起來 Sequences 內的元素是無限的,因為Sequences 內的元素 並不是每個元素都會儲存於記憶體空間,而是倚靠必要的情況來加載,因此也不會造成 記憶體不足的問題。
Sequences 特性
Sequences有分成兩種運算符 terminal operation(first
, toList
, count
etcetc) 與 intermediate operations (map
, distinct
, groupBy
etc)。只有當調用 terminal operation,intermediate operations 才會被驅動,執行中間的操作, 並在最後依調用的 terminal operation 返回相對應型態的資料 。
結語
本篇文章 只有淺淺的描述一些過程,希望可以幫助到讀者建立一個大概的印象。在看過本篇文章之後, 之後再閱讀其他較詳細的內容 可以更快了解原理。