java - Clojure 中的库函数与 Java 方法

标签 java function clojure

在阅读“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/

相关文章:

Java Axon 从 2.4.2 版本迁移到 4.0.3

java - 无法使 Guava base64 编码/解码工作

javascript - 当 javascript 函数用作对象的基础时的变量 -

在 Clojure 中实现的 A* 搜索的性能

java - 使用 Google 应用程序引擎进行 Spring Bootstrapping

language-agnostic - 参数还是参数?

jquery - 使用 pagebeforeshow jquery 跨多个页面执行一个函数

haskell - 一次解构一个列表的两个元素 (Clojure)

java - 为什么为 Java VM 编写了这么多新语言?

java - 在android中逐行读取文件后如何在UI上显示SetText值?