収集する

このページではコレクションパイプラインパターンのオペレーションについて説明します。詳細については、次の文書をお読みください。

マップ

各入力要素に指定した関数を適用し、結果を出力に出力します

簡単な例

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言語では一般的な慣用句です。