簡體   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