地图
将给定函数应用于输入的每个元素,并将结果放入输出
一个简单的例子
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 语言中的一种常见习惯用法。