繁体   English   中英

变异返回 Java object

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

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