gpt4 book ai didi

java - Clojure 中是否有适用于 Java 函数的应用函数?

转载 作者:太空狗 更新时间:2023-10-29 22:45:48 24 4
gpt4 key购买 nike

 user=> (Integer/rotateRight 0 0)
0

user=> (apply Integer/rotateRight [0 0])
CompilerException java.lang.RuntimeException: Unable to find static field:
rotateRight in class java.lang.Integer, compiling:(NO_SOURCE_PATH:172)

有什么方法可以在 Clojure 中申请 java 函数吗?如果不是,我如何编写支持此功能的宏或函数?

最佳答案

我能想到的最简单的事情就是将它包装在一个函数中,但我不完全确定这是否是最好/最惯用的方式:

user> (apply (fn [a b] (Integer/rotateRight a b)) [0 0])
0

或者,稍短但等效:

user> (apply #(Integer/rotateRight %1 %2) [0 0])
0

或者,您可以为您的 java 方法调用创建一个适当的包装函数:

(defn rotate-right [a b]
(Integer/rotateRight a b))

你会像这样使用它:

user> (apply rotate-right [0 0])
0

编辑:仅供娱乐,灵感来自 iradik 关于效率的评论,调用此方法的三种不同方式之间的时间比较:

;; direct method call (x 1 million)
user> (time (dorun (repeatedly 1E6 #(Integer/rotateRight 2 3))))
"Elapsed time: 441.326 msecs"
nil

;; method call inside function (x 1 million)
user> (time (dorun (repeatedly 1E6 #((fn [a b] (Integer/rotateRight a b)) 2 3))))
"Elapsed time: 451.749 msecs"
nil

;; method call in function using apply (x 1 million)
user> (time (dorun (repeatedly 1E6 #(apply (fn [a b] (Integer/rotateRight a b)) [2 3]))))
"Elapsed time: 609.556 msecs"
nil

关于java - Clojure 中是否有适用于 Java 函数的应用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8666098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com