当我第一次开始使用Clojure时,我遇到了类似的问题。几年前,我做过一些Java开发,但仍然对那里的库非常陌生。
介绍
我发现使用Java的最简单方法是不要真正使用它。我认为一本书对于开始使用Clojure的Java来说会有点多。你真正需要知道的并不多,除非你真的开始进入JVM/Java库。让我解释一下。
花更多的时间学习如何从内到外使用Clojure,并熟悉Clojure-Contrib。例如,在 clojure.contrib 中的 generic.math-functions 中。sqrt
你需要的许多东西实际上已经在Clojure中 - 但仍然有很多不是。
熟悉在Clojure中使用Java的调用约定和语法糖。例如,根据您的示例,从类中调用静态方法(基本上只是一个函数)。Math/sqrt
sqrt
Math
无论如何,这里有一个指南,如果你发现自己真的需要使用Java,它应该可以帮助你入门。我假设你已经做了一些强制性的OO编程,但没有太多其他的。即使你没有,你也应该没事。
Isaac's Clojurist's Guide to Java
类
类是一堆方法(作用于类的函数),也可以是数据类型:例如,创建该类型的新类:它初始化类Double(句点是调用类构造函数方法的语法糖,它用您提供的值初始化类)与值。Double
(Double. 1.2)
1.2
现在,看看 Java 6 API 中的 Double
类:
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是一个表示Double的类,可以做与Doubles有关的事情。Double
1.2
静态方法
例如,要从字符串中解析出Double值,我们可以使用静态方法(这意味着我们不需要特定的实例,我们可以像调用的那样调用它):Double
sqrt
parseDouble(String s)
(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.
所以这里我们有一个返回字符串的方法(如定义中公众后面的“String”所示,并且不带任何参数。但是等等!它确实需要一个参数。在Python中,它将是隐式参数:这在Java中被称为。self
this
我们也可以使用这样的方法:并得到相同的结果。(.toUpper (String. "Hey there"))
有关方法的更多信息
由于您在Java中处理可变数据和类,因此您需要能够将函数应用于类(实际上是类的实例),并且不需要返回值。
例如,假设我们正在处理来自图书馆的。我们可能需要对它做很多事情,而不是用它(你通常用值来操作,而不是在函数式语言中对它们进行操作)。我们可以,像这样:JFrame
javax.swing
(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
结束语
这应该为您自己探索JavaDocs做好准备。在这里,您将找到标准 Java 1.6 安装中可用的所有内容。会有新概念,但快速的Google搜索应该可以回答您的大多数问题,并且您始终可以带着具体的问题回到这里。
一定要看看其他重要的Clojure功能,如和以及和它的朋友。我不经常使用它们,但是当我需要时,它们可能是无价的。事实上,我自己仍然在理解它们。proxy
reify
extend-type
那里有很多东西,但这主要是数量问题,而不是复杂性问题。这不是一个坏问题。
补充阅读: