【问题标题】:Clojure: Idiomatic way to wrap each element in collectionClojure:将每个元素包装在集合中的惯用方式
【发布时间】:2016-11-01 15:19:23
【问题描述】:

如果我有一个特定形状的集合:

["Alpha", "Beta", "Gamma"]  ;; vector of strings

我想通过包装每个元素来转换它:

[{:name "Alpha"}, {:name "Beta"}, {:name "Gamma"}]

有没有比这个相当笨拙的map更好的表达方式?

(map #(identity {:name %}) coll)

【问题讨论】:

  • 我挺喜欢#(-> {:name %}),简洁易读,也可以用do代替箭头

标签: collections clojure


【解决方案1】:

如果你不喜欢map(fn [v] {:name v}),你可以使用for

(for [v coll] {:name v})
;; => ({:name "Alpha"} {:name "Beta"} {:name "Gamma"})

【讨论】:

  • 谢谢。 Lee 的map 强调了正在执行的底层操作,所以我认为这是一个更好的选择。
【解决方案2】:

你可以简单地使用fn:

(map (fn [v] {:name v}) coll)

如果你想使用匿名函数语法,你可以使用array-map 来构造地图:

(map #(array-map :name %) coll)

【讨论】:

  • hash-map 也可以。我刚刚找到了一些关于什么时候你可能想要一个v.s.的建议。另一个(至少 Clojure 库似乎是如何处理它的)。 clojuredocs.org/clojure.core/…
猜你喜欢
  • 1970-01-01
  • 2017-11-11
  • 2013-08-21
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多