如何将双冒号运算符转换为clojure?

时间:2015-03-21 05:15:22

标签: java clojure

我发现了一个新的java语法,通过source读取我试图纠缠的框架:

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

在clojure中,我可以将其翻译为:

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

但我不确定要为???

添加什么

2 个答案:

答案 0 :(得分:4)

IFn扩展了Runnable,所以你可以做到

#(Sirius/stop)

值得注意的是

  • 你必须制作lambda。 Clojure不会让你像Sirius/stop
  • 那样引用它
  • 引擎盖下的Java 8功能接口通过仅使用一种方法进行接口的匿名实现。所以

    new Thread(Sirius :: stop)

只是

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

如果相关界面不是Runnable / Callable,则您必须使用reify宏。

答案 1 :(得分:0)

@ 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并实现其唯一方法(功能接口始终只有一个方法),以便它在{{1}上调用静态方法from }类。因此,在Clojure中,它也可以翻译:

LocalDate