处理Java可选<;T>;在clojure
我正在编写与外部Java库交互的Clojure代码。其中一个方法返回Java处理Java可选<;T>;在clojure,java,clojure,clojure-java-interop,Java,Clojure,Clojure Java Interop,我正在编写与外部Java库交互的Clojure代码。其中一个方法返回JavaOptional对象。假设它返回Optional,我需要将Optional对象中的字符串值更改为小写。如果我用Java编写代码,我会使用map方法: Optional<String> ret = someObj.someMethod(); ret.map(String::toLowerCase) .map(...) .orElse("x"); 为了将clojure函数传递到期望Java lamb
Optional
对象。假设它返回Optional
,我需要将Optional
对象中的字符串值更改为小写。如果我用Java编写代码,我会使用map
方法:
Optional<String> ret = someObj.someMethod();
ret.map(String::toLowerCase)
.map(...)
.orElse("x");
为了将clojure函数传递到期望Java lambda的位置,我使用了上面定义的jfn
。事实上,它工作得很好
但我不确定这是最好的方法,因为我必须用Java的函数
包装调用Java方法的clojure函数
有没有更好/更简单的方法?如果我们可以直接调用Java
String
的toLowerCase
方法会更好 我不确定它是否适合您的用例,但您可以在早期“取消装箱”可选
,并使用some->
宏对空函数组合执行类似的短路操作
即使您需要一个可选的
,在以后使用该值,也可能比函数
互操作更容易提前取消装箱并在以后重新装箱
(defn optional->nilable [this]
(when (.isPresent this)
(.get this)))
(def maybe (Optional/of " something "))
(some-> (optional->nilable maybe)
(clojure.string/trim)
(not-empty)
(clojure.string/upper-case))
; => "SOMETHING"
然后,如果您需要转换回可选:
(Optional/ofNullable *1)
我不确定它是否适合您的用例,但您可以在早期“取消装箱”可选
,并使用some->
宏对空函数组合执行类似的短路操作
即使您需要一个可选的
,在以后使用该值,也可能比函数
互操作更容易提前取消装箱并在以后重新装箱
(defn optional->nilable [this]
(when (.isPresent this)
(.get this)))
(def maybe (Optional/of " something "))
(some-> (optional->nilable maybe)
(clojure.string/trim)
(not-empty)
(clojure.string/upper-case))
; => "SOMETHING"
然后,如果您需要转换回可选:
(Optional/ofNullable *1)
我不确定它是否适合您的用例,但您可以在早期“取消装箱”可选
,并使用some->
宏执行类似的操作。即使您以后需要一个带有值的可选的,重新装箱可能比执行函数互操作更容易。@TaylorWood感谢您的反馈。我认为你的想法是正确的,值得作为答案。我更喜欢你的第一种方法。如果你不喜欢装箱,并且你的函数都是文本,你可以把jfn
变成一个宏而不是一个函数:(defmacro-jfn[[arg]&body](具体化函数(apply[#~arg]~@body))
,然后(.map-ret(jfn[x](s/lower case-x))
。我不确定它是否适合你的用例,但你可以“unbox”早期使用可选
,并使用some->
宏执行类似操作。即使您以后需要一个带有值的可选的,重新装箱可能比执行函数互操作更容易。@TaylorWood感谢您的反馈。我认为你的想法是正确的,值得作为答案。我更喜欢你的第一种方法。如果您不喜欢装箱,并且您的函数都是文本,那么您可以将jfn
制作为宏而不是函数:(defmacro-jfn[[arg]&body](具体化函数(apply[#~arg]~@body))
,然后(.map-ret(jfn[x](s/lower case-x))
。您还可以内联展开,(一些->(.orElse可能为零),,,)
…您也可以内联展开,(一些->(.orElse可能为零),,,)
…