在阅读“Clojure 编程”时,我注意到在 Clojure 中有其他方法可以执行某些操作。例如,假设我们需要将字符串的所有字符转换为其大写变体。
我们可以使用.toUpperCase
:
user> (.toUpperCase "foo")
;; => "FOO"
以及clojure.string/upper-case
:
user> (clojure.string/upper-case "foo")
;; => "FOO"
虽然 clojure.string/upper-case
是一个函数,我们可以这样对待它:
user> (map clojure.string/upper-case ["foo" "bar" "baz"])
;; => ("FOO" "BAR" "BAZ")
...我们不能对 .toUpperCase
做同样的事情:
user> (map .toUpperCase ["foo" "bar" "baz"])
CompilerException java.lang.RuntimeException: Unable to resolve symbol...
我猜 .toUpperCase
是直接调用 Java 方法,Clojure 知道如何处理这个符号,当它是表单的第一个元素时。
问:我应该使用.toUpperCase
还是clojure.string/upper-case
以及它们之间的区别:
(map clojure.string/upper-case ["foo" "bar" "baz"])
和
(map (fn [x] (.toUpperCase x)) ["foo" "bar" "baz"])
最佳答案
两者都有效:它基本上是一种权衡,如下所示:
包装 Clojure 函数的优点:
- 更地道的 Clojure 风格
- 更可能是可移植的(例如 ClojureScript)
- 可以传递给高阶函数
使用 Java 方法的优点:
- 性能稍好(假设您正确使用类型提示以避免反射)
- 如果您与 Java 程序员/Java 代码库一起工作,则更加透明
通常,我更喜欢使用包装的 Clojure 函数,除非我已经进行了基准测试并确定了性能问题,此时我可能会直接使用 Java 互操作。
关于java - Clojure 中的库函数与 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25439971/