この記事は、Elixir Advent Calendar 2023 シリーズ14 の20日目です
【本コラムは、5分で読め、2分で試せます】
piacere です、ご覧いただいてありがとございます
Elixirの Enum
モジュールって、データ処理をスマートに書ける、Elixirの強力な標準ライブラリなのですが、他言語における break
のようなことをするのに悩むことありませんか?
実は、2通りの方法で break
が可能なこと、ご存知ですか? … 今回、それをTIPSとしてまとめておきました
小さなデータ向けの break
1~100をループする処理が、5番目で break
されていることがお分かりかと思います
1..10
|> Enum.reduce_while([], fn i, acc ->
if i == 5 do
{:halt, acc}
else
{:cont, acc ++ [i]}
end
end)
|> Enum.to_list
結果
[1, 2, 3, 4]
巨大なデータ向けの break
Stream
モジュールを使うと、データ全体を読み込まずに実行対象のみ評価するので、巨大なデータの前半で break
するときは、Enum.reduce_while
よりも有利になります
1..100000000000
|> Stream.transform(0, fn i, acc ->
if i == 5 do
{:halt, acc}
else
{[i], acc + i}
end
end)
|> Enum.to_list
結果
[1, 2, 3, 4]
p.s.
ぶっちゃけ、この7年のプロダクション開発で、break
を求められたシーンって無かったから、地味に競プロでしか使わないのでわw
ビッグデータで単純なフィルタリングする際は、DB側で処理しちゃいますしね
ちな、私は下記で使いました … 「ズンドコキヨシ」問題なので、やはりプロダクション開発では無いですね