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

zca*_*ate 5 java clojure

我发现了Java 8的一种新语法,该语法通读了我试图弄乱的框架的源代码

 Runtime.getRuntime().addShutdownHook(new Thread(Sirius::stop));
Run Code Online (Sandbox Code Playgroud)

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

(.addShutdownHook (Runtime/getRuntime) (Thread. ????))
Run Code Online (Sandbox Code Playgroud)

但我不确定该为 ???


Geo*_*mms 4

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

#(Sirius/stop)
Run Code Online (Sandbox Code Playgroud)

值得一提的是

  • 你必须制作 lambda。Clojure 不会让你像这样引用它Sirius/stop
  • Java 8 函数式接口的底层工作方式是仅使用一种方法来匿名实现接口。所以

    新线程(小天狼星::停止)

只是语法糖

new Thread(new Runnable {
    public void run() {
        Sirius.stop();
    }
})
Run Code Online (Sandbox Code Playgroud)

如果相关接口不是可运行/可调用的,则必须使用 reify 宏。

  • @zcaudate 你可以投票/标记为正确吗? (2认同)