Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理Java可选<;T>;在clojure_Java_Clojure_Clojure Java Interop - Fatal编程技术网

处理Java可选<;T>;在clojure

处理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

我正在编写与外部Java库交互的Clojure代码。其中一个方法返回Java
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可能为零),,,)