如何将双冒号运算符翻译成 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)))))
我发现了 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)))))