在Clojure中,Java的computeIfAbsent或putIfAbsent相当于什么?

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)

滚动我自己有替代方案吗?

Pio*_*dyl 5

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即可.