Sequences in Kotlin

liy Elaine
liy Elaine
Published in
4 min readJul 25, 2021

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 返回相對應型態的資料 。

結語

本篇文章 只有淺淺的描述一些過程,希望可以幫助到讀者建立一個大概的印象。在看過本篇文章之後, 之後再閱讀其他較詳細的內容 可以更快了解原理。

--

--