简体   繁体   English

在Clojure的循环中使用副作用方法来变换Java对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM