我有一个来自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
有人可以帮忙! 感谢
答案 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 ...])