[英]Mutating Java object by using side-effecting method in a loop in Clojure
In my Clojure code I'd like to to use a side-effecting method of Java object in a loop. 在我的Clojure代码中,我想在循环中使用Java对象的副作用方法。 My intention is to set multiple parameters of the Java object to values that I store in a map:
我的目的是将Java对象的多个参数设置为我存储在地图中的值:
(def params {
:param1 "value1"
:param2 "value2"
})
If I set param1
to "value1"
directly, it works fine: 如果我直接将
param1
设置为"value1"
,它可以正常工作:
(.setParam object (str :param1) "value1")
However, if I want to iterate over the params
map forcing the evaluation by using doseq
, the Java object remains untouched: 但是,如果我想迭代使用
doseq
强制评估的params
映射,Java对象保持不变:
(doseq [[param value] params] (.setParam object (str param) value))
How to loop over the params
map and use the side-effecting setParam
method so that the Java object
is mutated? 如何遍历
params
映射并使用副作用setParam
方法以便Java object
发生变异?
I believe this is likely a beginner error that would be easy to resolve for more experienced Clojure users. 我相信这可能是一个初学者错误,很容易为更有经验的Clojure用户解决。
Calling str
on a keyword includes the colon in the result. 在关键字上调用
str
包括结果中的冒号。 Try name
instead: 尝试
name
:
(doseq [[param value] params] (.setParam object (name param) value))
It should work, I think you're doing something else wrong. 它应该工作,我认为你做错了什么。
user=> (def m (java.util.HashMap.))
#'user/m
user=> (doseq [[p v] params] (.put m p v))
nil
user=> m
{:param2 "value2", :param1 "value1"}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.