我有一个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
语句并通过增量调用方法进行构建,因为我认为这是不优雅的。什么好主意吗?
您也可以像下面这样混合->
和cond->
:
(-> (ConnectParam/newBuilder)
(.withHost (env :host))
(.withPort (env :port))
(cond-> (not (= (env :environment) "dev"))
(.withAuthorization (env :user) (env :password)))
(.build))
你可以这样做:
(def connect-params (-> (ConnectParam/newBuilder)
(.withHost (env :host))
(.withPort (env :port))
(#(if (not (= (env :environment) "dev"))
(.withAuthorization % (env :user) (env :password))
%))
(.build)))
将if
封装在对匿名函数(#(if ...))
的调用中。线程优先的宏将把上述形式的求值作为函数调用的第一个参数插入。