![](/img/trans.png)
[英]Mutating Java object by using side-effecting method in a loop in Clojure
[英]Mutating a void returning Java object
我不知道如何最好地将以下 Java 代码翻译成 ideomatic Clojure
var lsClient = new LightstreamerClient(...);
lsClient.connectionDetails.setUser(...);
lsClient.connectionDetails.setPassword(...);
lsClient.addListener(...);
lsClient.connect();
我尝试了很多东西,但最终还是无法编译
(defn create-connection-and-subscriptions!
[{:keys [identifier cst token ls-endpoint]} callback]
(let [password (str "CST-" cst "|XST-" token)
client (LightstreamerClient. ls-endpoint nil)
connection-listener (client-listener-adapter/create callback)]
(doseq [c [client]]
(.setPassword (.-connectionDetails c) password)
( .setUser (.-connectionDetails c) identifier)
(.addListener connection-listener c)
(.connect c))
))
我应该如何更改它才能像 Java 代码一样工作。 OBS ...
在 java 代码中只是我已经删除了输入。
你写的东西很奇怪(为什么对单个项目进行doseq
?),但应该有效。 如果你想这样做,我会用 (let [ (let [c client]
client] 替换(doseq [c [client]]
,或者只是将现有变量重命名为c
。
如果你想避免重新输入变量名,那么doto
是使用相同的第一个参数执行多个副作用的工具。 对于你只调用两个方法的对象来说,这是否值得,这不是很清楚,但你可以写
(doto (.-connectionDetails client)
(.setPassword password)
(.setUser identifier))
(doto client
(.addListener connection-listener)
(.connect))
如果您真的致力于将所有这一切作为一个表达式来完成,并且不使用新变量,并且不介意重写一些迷宫般的宏,那么您可以这样写:
(doto (LightstreamerClient. ls-endpoint nil)
(-> (.-connectionDetails)
(doto
(.setPassword password)
(.setUser identifier)))
(.addListener connection-listener)
(.connect))
我觉得这很可爱,但是代码应该写得可读,而不是可爱,所以我不推荐它。 不过,您可能喜欢对它的工作原理感到困惑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.