收集

此頁面描述了收集管線模式中的操作。如需更多脈絡,請閱讀

地圖

將給定的函式套用至輸入的每個元素,並將結果放入輸出

一個簡單的範例

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 語言中常見的慣用語。