Gra*_*oss 4 java dictionary clojure
使用Java中的映射,您可以编写map.computeIfAbsent(key, f)该映射以检查映射中是否存在密钥,如果不是,则调用f密钥以生成值,并在映射中输入该值.如果map.putIfAbsent(key, value)地图中尚不存在该键,您还可以将值放在地图中.
忽略Java方法也返回值的事实,而是想要返回新映射,Clojure中的等效代码是什么?
到目前为止,我提出的最好的方法就是用类似的东西来推动我自己
(defn compute-if-absent [map key f]
(if (key map)
map
(assoc map key (f key))))
Run Code Online (Sandbox Code Playgroud)
滚动我自己有替代方案吗?
Clojure映射是不可变的,因此您将始终返回具有更新内容的新映射 - 因此您的函数将始终是线程安全的.这也意味着您不能拥有一个全局变量来保存您的地图并将其变异.
你的实现compute-if-absent几乎是正确的.例如,对于虚假的密钥,它将失败{false 1}.您需要改变您的if条件并使用contains?而不是key:
(defn compute-if-absent [m k f]
(if (contains? m k)
m
(assoc m key (f k))))
Run Code Online (Sandbox Code Playgroud)
如果您确实需要具有相同的行为,ConcurrentMap只需在Clojure中使用Java interop即可.