Elixir-streams
Elixir-ストリーム
多くの関数は列挙可能なものを期待し、 list を返します。 つまり、Enumを使用して複数の操作を実行している間、各操作は結果に到達するまで中間リストを生成します。
ストリームは、列挙型による積極的な操作ではなく、遅延操作をサポートします。 要するに、* streamsは、レイジーで構成可能な列挙可能要素です*。 つまり、絶対に必要な場合を除き、Streamsは操作を実行しません。 これを理解するための例を考えてみましょう-
odd? = &(rem(&1, 2) != 0)
res = 1..100_000 |> Stream.map(&(&1 * 3)) |> Stream.filter(odd?) |> Enum.sum
IO.puts(res)
上記のプログラムが実行されると、次の結果が生成されます-
7500000000
上記の例では、 1..100_000 |> Stream.map(&(&1 3))*は、範囲1..100_000でのマップ計算を表すデータ型、実際のストリームを返します。 この表現はまだ評価されていません。 ストリームは、中間リストを生成する代わりに、基になるストリームをEnumモジュールに渡すときにのみ呼び出される一連の計算を構築します。 ストリームは、大規模な、場合によっては無限のコレクションを操作するときに役立ちます。
ストリームと列挙型には多くの共通の機能があります。 ストリームは主に、入力列挙型の計算を実行した後に戻り値としてリストを生成したEnumモジュールが提供するのと同じ関数を提供します。 それらのいくつかは、次の表に記載されています-
Sr.No. | Function and its Description |
---|---|
1 |
chunk(enum, n, step, leftover \\ nil) それぞれがn個のアイテムを含むチャンクで列挙型をストリーミングします。各新しいチャンクは列挙型へのステップ要素を開始します。 |
2 |
concat(enumerables) enumerable内の各enumerableを列挙するストリームを作成します。 |
3 |
each(enum, fun) 各アイテムに対して指定された関数を実行します。 |
4 |
filter(enum, fun) 列挙の指定された関数に従って要素をフィルタリングするストリームを作成します。 |
5 |
map(enum, fun) 指定された関数を列挙に適用するストリームを作成します。 |
6 |
drop(enum, n) 列挙可能から次のn個のアイテムを遅延ドロップします。 |