如何将双冒号运算符翻译成 Clojure?

how to translate the double colon operator to clojure?

我发现了 java 的新语法 8 通读 source 以了解我正在尝试讨论的框架:

 Runtime.getRuntime().addShutdownHook(new Thread(Sirius::stop));

在clojure中,我可以这样翻译:

(.addShutdownHook (Runtime/getRuntime) (Thread. ????))

但我不确定要为 ???

添加什么

IFn 扩展了 Runnable,所以你可以这样做

#(Sirius/stop)

值得注意的是

  • 你必须创建 lambda。 Clojure 不会让您像 Sirius/stop
  • 那样引用它
  • Java 8 个功能接口通过仅使用一种方法匿名实现接口来工作。所以

    新线程(Sirius::stop)

只是

的语法糖
new Thread(new Runnable {
    public void run() {
        Sirius.stop();
    }
})

如果有问题的界面不是 Runnable/Callable,您将不得不使用 reify 宏。

@george-simms 有正确的解释,但对于任何正在寻找不是 Runnable/Callable 的示例并且需要使用 reify 的人来说, 在这里。

假设您想像这样使用 DateTimeFormatter parse 方法:

DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE();
LocalDate d = dtf.parse("2019-04-04", LocalDate::from);

您需要检查 parse 的第二个参数的功能接口类型,在我们的例子中是 TemporalQuery。也就是说,你需要reify TemporalQuery,并实现它唯一的方法(函数式接口总是只有一个方法),这样它就可以调用[=22=上的静态方法from ] class。所以在 Clojure 中它也会翻译:

(import 'java.time.format.DateTimeFormatter)
(import 'java.time.temporal.TemporalQuery)
(import 'java.time.LocalDate)

(let [dtf (DateTimeFormatter/ISO_LOCAL_DATE)]
  (.parse dtf "2019-04-04"
          (reify TemporalQuery
                 (queryFrom [this temporal]
                            (LocalDate/from temporal)))))