Map.filter/2を楽しみます(Elixir)


ひさかたの光のどけき春の日にしづ心なく花の散るらむ

この歌は、私が学んだ小学校の国語の教科書に載っていました。
そらで言えます。


Advent Calendar 2022 83日目1の記事です。
I'm looking forward to 12/25,2022
私のAdvent Calendar 2022 一覧


はじめに

Elixirを楽しんでいますか

今日は、Map.filter/2を紹介します。

動機

Map.filter/2を紹介しようとおもった動機です。

  • 使用したことがない
  • Elixir 1.13.0で追加された関数
  • Advent Calendar 2022 goes behind 7 days.

Map.filter/2

公式の説明をそのまま掲載します。

サンプルを貼っておきます。

iex> Map.filter(%{one: 1, two: 2, three: 3}, fn {_key, val} -> rem(val, 2) == 1 end)
%{one: 1, three: 3}

上記の例では、値が奇数である要素をMapに残すことになります。
第2引数の関数は、各要素をタプルで{キー, 値}を受け取ります。
関数の結果でTruthyなものを返した要素がMapに残ります。

Truthy、Falsy

Truthy、Falsyについては、公式のTruthy and falsy valuesをご参照ください。

  • nilfalseがFalsyです
  • 上記以外は、Truthyです

Note

@mnishiguchi さんに重要なポイントを教えていただきました。
追記しておきます。
公式ドキュメントのNoteです。

if you find yourself doing multiple calls to Map.filter/2 and Map.reject/2 in a pipeline, it is likely more efficient to use Enum.map/2 and Enum.filter/2 instead and convert to a map at the end using Map.new/1.

パイプラインの中で何度もMap.filter/2やMap.reject/2をするくらいなら、そのかわりにEnum.map/2やEnum.filter/2を使って最後にMap.new/1でMapにするほうが効率的です。

Map.reject/2

Map.filter/2があれば、Map.reject/2もあるだろう!

iex> Map.reject(%{one: 1, two: 2, three: 3}, fn {_key, val} -> rem(val, 2) == 1 end)
%{two: 2}

ありました

上記の例では、値が奇数ではない(つまり偶数である)要素をMapに残すことになります。
第2引数の関数は、各要素をタプルで{キー, 値}を受け取ります。
関数の結果でFalsyなものを返した要素がMapに残ります。

Truthy、Falsyについては、公式のTruthy and falsy valuesをご参照ください。

  • nilfalseがFalsyです
  • 上記以外は、Truthyです

Wrapping up

Enjoy Elixir
$\huge{Enjoy\ Elixir🚀}$

本日は、以下をご紹介しました。

以上です。

  1. @kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。