threadfirst 中的条件方法调用

问题描述 投票:0回答:2

我有一个 java 对象,我正在调用各种构建器方法。我希望在某些情况下调用某些方法。这应该看起来像:

(def connect-params (-> (ConnectParam/newBuilder)
                        (.withHost  (env :host))
                        (.withPort  (env :port))
                        (if (not (= (env :environment) "dev"))
                            #(.withAuthorization % (env :user) (env :password))
                            identity)
                        (.build)))

这个问题是线程优先宏将构建器作为第一个参数推送给

if
条件——这显然不是本意。我相信我可以先写一个宏来评估内部条件,但我认为应该有一些优雅的函数式方法可以在没有宏的情况下做到这一点。我不想使用
let
语句并通过增量调用方法来构建,因为我认为它不够优雅。有什么想法吗?

clojure
2个回答
0
投票

你可以这样做:

(def connect-params (-> (ConnectParam/newBuilder)
                        (.withHost  (env :host))
                        (.withPort  (env :port))
                        (#(if (not (= (env :environment) "dev"))
                            (.withAuthorization % (env :user) (env :password))
                            %))
                        (.build)))

if
包装在对匿名函数的调用中:
(#(if ...))
。线程优先宏将插入前面形式的评估作为该函数调用的第一个参数。


0
投票

你也可以像下面这样混合

->
cond->

(-> (ConnectParam/newBuilder)
    (.withHost (env :host))
    (.withPort (env :port))
    (cond-> (not (= (env :environment) "dev"))
            (.withAuthorization (env :user) (env :password)))
    (.build))
© www.soinside.com 2019 - 2024. All rights reserved.