【问题标题】:Passing a Clojure function as java.util.Function将 Clojure 函数作为 java.util.Function 传递
【发布时间】:2015-09-11 13:57:45
【问题描述】:

在主题中,我想使用一个以函数作为参数的 Java 方法,并为它提供一个 Clojure 函数,无论是匿名函数还是常规函数。任何人都知道如何做到这一点?

【问题讨论】:

  • (reify java.util.function.Function)?
  • reify 方法有效,但过于冗长。我认为我们将看到越来越多的 Java API 使用 java.util.function 中的函数式接口,因此最好在 Clojure 本身中解决这个问题。 Clojure 函数已经实现了RunnableCallable

标签: java clojure interop


【解决方案1】:

java.util.function.Function 是一个接口。
你需要实现抽象方法apply(T t)
应该这样做:

(defn hello [name]
  (str "Hello, " name "!"))

(defn my-function[]
  (reify 
    java.util.function.Function
    (apply [this arg]
      (hello arg))))

;; then do (my-function) where you need to pass in a Function

【讨论】:

    【解决方案2】:

    Terje 接受的答案是绝对正确的。但是你可以让它更容易使用一阶函数:

    (defn ^java.util.function.Function as-function [f]
      (reify java.util.function.Function
        (apply [this arg] (f arg))))
    

    或宏:

    (defmacro jfn [& args]
      `(as-function (fn ~@args)))
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多