Clojure的。如何汇总地图的所有值

时间:2018-01-30 06:18:33

标签: clojure

我有一个来自firestore的返回hashmap,如下所示:

#object[java.util.HashMap 0x163df674 {reference=NEW_USER, type=Promotion, includedScans=100}]
#object[java.util.HashMap 0x140a8085 {reference=NEW_USER, type=Promotion, includedScans=50}]

...

我想在Clojure中总结所有“includedScans”

预期结果:150

有人可以帮忙! 感谢

3 个答案:

答案 0 :(得分:1)

1 - 使用java.util.HashMap

给出n个地图,

user=> (def map1 (java.util.HashMap. {:reference "user1" :type "Promotion" :included-scans 100}))
#'user/map1

user=> (def map2 (java.util.HashMap. {:reference "user1" :type "Promotion" :included-scans 50}))
#'user/map2

映射哈希映射的向量,

user=> (map #(:included-scans %) [map1 map2]) ;; #() represents a function on each element
(100 50)

;; alternative way is
user=> (map :included-scans [map1 map2])
(100 50)

使用reduce函数

对值进行求和
user=> (reduce + (map #(:included-scans %) [map1 map2]))
150

请注意,上面的地图是java.lang.HashMap,clojure有自己的数据结构,也称为clojure.lang.PersistentHashMap

2 - 使用clojure.lang.PersistentHashMap

给出n个地图,

user=> (def map1 (hash-map :reference "user1" :type "Promotion" :included-scans 100))
#'user/map1

user=> (def map2 (hash-map :reference "user1" :type "Promotion" :included-scans 50))
#'user/map2

您只需映射它们并获得所需的密钥:included-scans

user=> (map #(:included-scans %) [map1 map2])
(100 50)

然后总结使用reduce函数,

user=> (reduce + (map #(:included-scans %) [map1 map2]))
150

引用

https://clojuredocs.org/clojure.core/hash-map

Clojure: working with a java.util.HashMap in an idiomatic Clojure fashion

答案 1 :(得分:0)

您可以按照here中的代码示例将Java-Map转换为Clojure-Map。

user> (java.util.HashMap. {:foo :bar})
#<HashMap {:foo=:bar}>

user> (into {} (java.util.HashMap. {:foo :bar}))
{:foo :bar}

转换后,总结可以这样完成:

您可以像使用Clojure中的任何其他Map一样使用Java-Hashmap(请参阅注释)。总结可以这样做:

user> (reduce (fn[s m] (+ s (get m "includedScans"))) 0 [map1 map2 ...])

答案 2 :(得分:0)

您可以使用transduce以高效,非懒惰的方式执行此操作。

(transduce (map #(get % "includedScans" 0)) + 0 [map1 map2 ...])