SequenceとList(Array)
TL;DR
Sequence
は1つの値
に対する操作が全て
行われた後、必要なら次の値
が処理される。
List
はすべての値
に対して1つの操作
が行われた後、必要なら次の操作
が行われる
Kotlinでのデータの集合
Kotlinにはデータの集合を操作するためのクラスとして、List
, Array
, Sequence
があります。
ListやArrayは他の多くに言語にもあるため想像がつくかと思います。では、Sequenceとは何なのでしょうか?
Sequenceを理解するためにList, Arrayとの違いをみていきましょう。
List vs Array
List
とArray
はそれぞれの要素に対して操作を行うという観点ではほとんど同じと言えます。大きな違いとしてはArray
はJavaの配列型と同等の扱いになります。Javaとの互換性を保つためにArray
があると推測できます。
以降の文ではArray
は無視してSequence
とList
について書いていきます。
Sequence vs List
実際の処理を見ると違いがわかりやすいので、
(1, 2, 3, 4)の値を持ったSequenceとListに対して以下の処理を行う場合の動作をみていきます
- それぞれの要素を二乗する :
map{v -> v * v}
- それぞれの要素に1を足す :
map{v -> v + 1}
- 値が5の要素を除く :
filter{v != 5}
- 残った要素から最初に2つを取り出す:
take(2)
- 1〜4の結果を出力:
foreach{ v -> println(v)}
処理過程
操作の過程を以下の表に示します。
Sequenceの4
の列がすべて空白になっています(書き忘れじゃないですよ)。
今回の場合、Sequenceでは値4
に対してまったく操作が行われません。ここがListとの大きな違いとなります。
Sequenceでは遅延評価が行われ、値1
に対する操作(map -> map -> filter -> take)がすべて終わった後に値2
,3
の操作が行われます。
値1
〜3
のtake(2)が終わった段階でtake(2)の結果が決定するため値4
の処理は行われません。
一方、Listの場合は値1
〜4
に対してmap(v*v)の操作を行った結果のListを作成します。作成されたListに対してさらにmap(v+1)の操作, さらにfilter(), take()と続きます。
まとめ
Sequence
は1つの値
に対する操作が全て
行われた後、必要なら次の値
が処理される。
List
はすべての値
に対して1つの操作
が行われた後、必要なら次の操作
が行われる
※ Sequenceは実際に値が必要になるまで処理が行われない(遅延される)などの違いもあります。