このページではコレクションパイプラインパターンのオペレーションについて説明します。詳細については、次の文書をお読みください。
- コレクションパイプライン記事: コレクションパイプラインパターンを説明する記事
- オペレーションカタログ: 対象のオペレーションの一覧
マップ
各入力要素に指定した関数を適用し、結果を出力に出力します
簡単な例
ruby…
[1,2,3].map {|i| i * i} # => [1, 4, 9]
clojure…
(map #(* % %) [1 2 3]) ;; => (1 4 9)
他のコレクションオペレーションと同様に、ハッシュに対してmapを実行する場合は、キーと値へのアクセスを処理するためにjiggery-pokeryが必要になります。デストラクチャリングを利用すると、単一のペア引数をデストラクチャリングできます。
clojure…(map (fn [[k,v]] (format "%s (%s)" v k)) {"BR" "Brazil", "DE" "Germany"}) ;; => ("Germany (DE)" "Brazil (BR)")
OO言語ではHashクラスにmapを定義する必要があります。この場合、2つのパラメータを持つ関数を渡す必要があります。
ruby…{BR: 'Brazil', DE: 'Germany'}.map{|k,v| format("%s (%s)", v, k)} # => ["Brazil (BR)", "Germany (DE)"]
結果が得られる場合も得られない場合もある関数を使用してmapを使用すると、多くのnilを含むmapが得られます。これらのnilを削除するにはfilterを使用します。
メソッドチェーンを使用すると、map関数は1つの入力コレクションに対してのみ操作できるため、提供される関数は1つの引数しか使用できません。しかし、関数スタイルでは、複数のコレクションを複数引数関数に渡すことができます。したがって、ここではclojureで任意の数のコレクションを使用してmapを使用できます。
(map + [1 2 3] [10 20 30] [100 200 300]) ; => [111 222 333]
このような処理方法により、テーブルの転置に関する慣用句が生まれます。行のリストから開始すると想定します
[[:a1 :b1] [:a2 :b2] [:a3 :b3]]
…これを列のリストに変換したいとします
[[:a1 :a2 :a3] [:b1 :b2 :b3]]]
次の方法で実行できます
(apply map vector input)
もちろん、これは転置演算子にすぎませんが、lispy言語では一般的な慣用句です。