【问题标题】:How to map PersistentVector of PersistentHashMaps in Clojure?如何在 Clojure 中映射 PersistentHashMaps 的 PersistentVector?
【发布时间】:2015-05-29 02:08:03
【问题描述】:

我有一个 PersistentHashMaps 的 PersistentVector:

[
  {:url http://www.url.com, id: some_id ...},
  {:url http://www.url.com, id: some_id ...},
  {:url http://www.url.com, id: some_id ...},
]

我需要在这里收集所有ids,所以我需要映射一个向量并从每个映射中选择id 值。

我愿意:

(map #(get % :id) (all-users))

有没有更好的方法来做到这一点?

【问题讨论】:

  • 在 Clojure 中,我们通常只讨论向量和映射,而不会提及底层的类,因为为了提高效率,存在多种持久向量和映射。

标签: clojure functional-programming


【解决方案1】:

关键字可以用作函数。

(map :id (all-users))

如果您使用 Clojure 1.7 并且不需要懒惰,例如。 G。想要将整个集合实现为矢量,您可以使用地图传感器:

(into [] (map :id) (all-users))

【讨论】:

    【解决方案2】:

    除非你知道你需要 map 的惰性行为,否则我总是建议使用 mapv:

    (def all-users [ {:id 111 ...} 
                     {:id 222 ...}
                     ... ] )
    (mapv :id all-users)
    

    不同之处在于mapv 总是被立即评估,并将结果填充到一个向量中以便于访问。惰性序列非常适合非常大或非常慢的事物,但它们引入了额外的时序不确定性,这是 99% 的用例所不需要的。

    【讨论】:

    • 您的帖子内容为“默认使用mapv,这是国际海事组织的坏建议。因此我不赞成。另外:随机访问,不容易访问;每一步开销,而不是时间。99% stat很遥远,恰恰相反mapv 在 99% 的情况下都没有用:大型 Clojure 程序由许多转换步骤组成,而惰性序列是惯用的构建块,正是因为您不想在步骤之间分配新向量,尤其是当您不知道函数用户将如何处理结果。转换器是您描述的问题的通用解决方案,mapv 从来没有。
    猜你喜欢
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 2023-04-08
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多