地圖
將給定的函式套用至輸入的每個元素,並將結果放入輸出
一個簡單的範例
ruby…
[1,2,3].map {|i| i * i} # => [1, 4, 9]
clojure…
(map #(* % %) [1 2 3]) ;; => (1 4 9)
與任何收集操作一樣,如果您想對雜湊執行 map,您需要一些技巧來處理存取鍵和值。透過解構,您可以解構單一對應參數。
clojure…(map (fn [[k,v]] (format "%s (%s)" v k)) {"BR" "Brazil", "DE" "Germany"}) ;; => ("Germany (DE)" "Brazil (BR)")
OO 語言需要在 Hash 類別上定義 map,在這種情況下,您需要傳遞一個具有兩個參數的函式。
ruby…{BR: 'Brazil', DE: 'Germany'}.map{|k,v| format("%s (%s)", v, k)} # => ["Brazil (BR)", "Germany (DE)"]
如果您使用可能或可能不會產生結果的函式來執行 map,您將會得到一個包含許多 nil 的 map。若要移除這些 nil,請使用 filter。
透過方法鏈接,map 函式只能對單一輸入收集執行操作,因此提供的函式只能接受一個參數。然而,透過函式風格,您可以擁有傳遞給多個參數函式的多個收集。因此,在 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 語言中常見的慣用語。