当我第一次开始使用 Clojure 时,我遇到了类似的问题。几年前我做过一些 Java 开发,但对那里的库仍然很陌生。
简介
我发现使用 Java 最简单的方法是不真的使用它。我认为从 Clojure 开始使用 Java 的书会有点多。除非您真正开始深入了解 JVM/Java 库,否则您真正需要了解的并不多。让我解释一下。
花更多时间学习如何从内到外使用 Clojure,并熟悉 Clojure-Contrib。例如,clojure.contrib 中的sqrt is in generic.math-functions。
您需要的许多东西实际上已经在 Clojure 中了——但还有很多东西还没有。
熟悉 Clojure 中用于使用 Java 的调用约定和语法糖。例如Math/sqrt,根据您的示例,正在从类 Math 调用静态方法(基本上只是一个函数)sqrt。
无论如何,如果您发现自己真的需要使用 Java,这里有一个指南可以帮助您入门。我将假设您已经完成了一些命令式OO编程,但其他的不多。即使你没有,你也应该没问题。
Isaac 的 Clojurist 的 Java 指南
类
类是一组方法(作用于类的函数),它们
也可以是数据类型:例如创建一个 Double 类型的新类:(Double. 1.2) 初始化类 Double (句点是用于调用类构造方法的语法糖,它使用您提供的值初始化类)值 1.2 .
现在,看看 Java 6 API 中的Double class:
Double
public Double(double value)
Constructs a newly allocated Double object that represents the
primitive double argument.
Parameters:
value - the value to be represented by the Double.
所以你可以看到那里发生了什么。您“构建”了一个新的Double,其值为1.2,它是一个double。那里有点令人困惑,但实际上 Double 是一个代表 Double 并且可以做与双精度相关的事情的类。
静态方法
例如,要从字符串中解析出 Double 值,我们可以使用静态方法(这意味着我们不需要 Double 的特定实例,我们可以像调用 sqrt 一样调用它)@ 987654342@:
(Double/parseDouble "1.2") => 1.2
这里不要太麻烦。
非静态方法
假设我们想使用一个我们初始化的 Java 类。不太难:
(-> (String. "Hey there") ;; make a new String object
(.toUpperCase)) ;; pass it to .toUpperCase (look up -> to see what it does)
;; toUpperCase is a non-static method
=> "HEY THERE"
所以现在我们使用了一种非静态的方法,它需要一个真实的、实时的String 对象来处理。让我们看看文档是如何工作的:
toUpperCase
public String toUpperCase()
Converts all of the characters in this String to upper case using
the rules of the default locale. This method is equivalent to
toUpperCase(Locale.getDefault()).
Returns:
the String, converted to uppercase.
所以这里我们有一个返回字符串的方法(如定义中public后面的“String”所示,并且不带参数。但是等等!它确实带参数。在Python中,它是隐式参数self:在Java中称为this。
我们也可以使用这样的方法:(.toUpper (String. "Hey there")) 并得到相同的结果。
更多方法
由于您在 Java 中处理可变数据和类,因此您需要能够将函数应用于类(实际上是类的实例)并且不期望返回值。
例如,假设我们正在处理来自javax.swing 库的JFrame。我们可能需要做很多事情to它,而不是with它(你通常操作with值,而不是on em> 函数式语言)。我们可以这样:
(doto (JFrame. "My Frame!");; clever name
(.setContentPane ... here we'd add a JPanel or something to the JFrame)
(.pack) ;; this simply arranges the stuff in the frame–don't worry about it
(.setVisibleTrue)) ;; this makes the Frame visible
doto 只是将其第一个参数传递给您提供的所有其他函数,并将其作为第一个参数传递给它们。所以在这里,我们只是对JFrame 做了很多事情,这些事情并没有特别返回任何东西。所有这些方法都在文档中列为JFrame 的方法(或其超类……暂时不用担心这些)。
结束
这应该让您为现在自己探索the JavaDocs 做好准备。在这里,您将找到标准 Java 1.6 安装中可用的所有内容。会有新概念,但快速的 Google 搜索应该可以回答您的大部分问题,并且您可以随时返回这里找到具体的问题。
请务必查看其他重要的 Clojure 函数,例如 proxy 和 reify 以及 extend-type 及其朋友。我不经常使用它们,但当我需要时,它们可能是无价的。事实上,我自己仍然在理解它们。
那里有很多,但主要是数量问题而不是复杂性问题。这不是一个坏问题。
补充阅读: