如何将Java的LightstreamerClient代码转为地道Clojure实现
修正Clojure版Lightstreamer客户端连接代码
原始Java实现
目标功能对应的Java代码:
var lsClient = new LightstreamerClient(...); lsClient.connectionDetails.setUser(...); lsClient.connectionDetails.setPassword(...); lsClient.addListener(...); lsClient.connect();
用户的错误Clojure代码
(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)) ))
修正后的地道Clojure实现
(defn create-connection-and-subscriptions! [{:keys [identifier cst token ls-endpoint]} callback] (let [password (str "CST-" cst "|XST-" token) client (LightstreamerClient. ls-endpoint nil) conn-details (.-connectionDetails client) connection-listener (client-listener-adapter/create callback)] (.setUser conn-details identifier) (.setPassword conn-details password) (.addListener client connection-listener) (.connect client) client)) ; 可选:返回客户端实例,方便后续扩展操作
问题说明
- 方法参数顺序错误:原代码中
.addListener的参数顺序颠倒了,Java原生调用是lsClient.addListener(listener),对应Clojure应该是(.addListener client connection-listener),不能将监听器放在实例前面。 - 冗余循环无意义:原代码用
doseq遍历仅含单个元素的列表[client],完全没必要,直接对实例操作即可简化代码。 - 可读性优化:将
connectionDetails提取为局部变量,避免重复通过.-connectionDetails访问,让代码更简洁易读。
内容的提问来源于stack exchange,提问作者user3139545
相关产品推荐
相关产品推荐

