收集

此页面描述了集合管道模式中的一个操作。有关更多上下文,请阅读

地图

将给定函数应用于输入的每个元素,并将结果放入输出

一个简单的例子

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)")

面向对象语言需要在 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 语言中的一种常见习惯用法。