Я пишу код Clojure, взаимодействующий с внешней библиотекой Java. Один из методов возвращает Java Optional
объект. Давайте предположим, что он возвращает Optional<String>
, и мне нужно изменить строковое значение в объекте Optional
, например, в нижний регистр. Я бы использовал метод map
, если бы я написал код в Java:
Optional<String> ret = someObj.someMethod();
ret.map(String::toLowerCase)
.map(...)
.orElse("x");
Итак, мне нужно вызвать someObj.someMethod()
в Clojure и выполнить аналогичную работу. Я нашел следующее: Передача функции Clojure как java .util.Function
Итак, я написал такой код:
(defn ^java.util.function.Function jfn [f]
(reify java.util.function.Function
(apply [this arg] (f arg))))
(let [ret (.someMethod someObj)]
(.. ret
(map (jfn (fn [x] (s/lower-case x))))
(map (jfn (...)))
(orElse "x")))
Чтобы передать Функция clojure к месту, которое ожидает Java лямбда, я использовал jfn
, определенный как выше. И на самом деле все работает отлично.
Но я не уверен, что это лучший способ сделать это, поскольку мне нужно обернуть функцию clojure, которая вызывает метод Java, внутри Java * Function
.
Есть ли лучший / более простой способ сделать это? Будет лучше, если мы сможем напрямую вызывать метод Java String
toLowerCase
.