用于Clojure用户的Java
我一直在使用Lisp,而且我正在追赶clojure。 关于clojure的好处是我可以自然地使用所有java函数,而关于clojure的坏处也是我必须自然地了解java函数。
例如,我不得不花一些时间(谷歌搜索)在Java中找到方形函数(数学/ sqrt in clojure表示法)。
对于那些不熟悉Java的clojure用户,你能为我推荐一些Java函数(库)的好信息资源吗?
它可以是任何东西 – 好书,网页,论坛或其他什么。
我第一次使用Clojure时遇到了类似的问题。 我在几年前做过一些Java开发,但对那里的库仍然很不熟悉。
介绍
我发现使用Java最简单的方法就是不使用它。 我认为只需从Clojure开始使用Java就可以了解一本书。 除非你真正开始进入JVM / Java库,否则你真的不需要知道多少。 让我解释。
花更多时间学习如何在内部和外部使用Clojure,并熟悉Clojure-Contrib。 例如, sqrt
在clojure.contrib 中的generic.math函数中。
你需要的许多东西实际上已经在Clojure中 – 但仍然有很多不是。
熟悉Clojure中使用Java的调用约定和语法糖。 例如Math/sqrt
,根据你的例子,从类Math
调用静态方法(基本上只是一个函数) sqrt
。
无论如何,如果您发现自己确实需要使用Java,这里有一个指南可以帮助您入门。 我假设你已经做了一些必要的OO编程,但没有其他的。 即使你没有,你也应该没问题。
艾萨克的Clojurist的Java指南
类
类是一组方法(作用于类的函数),也可以是数据类型:例如,创建Double
类型的新类: (Double. 1.2)
初始化类Double(句点是句法)用于调用类构造函数方法的糖,它使用您提供的值初始化类),值为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.
所以你可以看到那里发生的事情。 你“建造”了一个价值1.2
的新Double
,这是一个双倍。 那里有点令人困惑,但真的是Double是一个代表Double的类,可以做与双打有关的事情。
静态方法
例如,要从字符串中解析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.
所以这里我们有一个方法返回一个字符串(如定义中的public之后的“String”所示,并且不带参数。但是等等!它确实需要一个参数。在Python中,它是隐式参数self
:这在Java中称为this
。
我们也可以使用这样的方法:( (.toUpper (String. "Hey there"))
并获得相同的结果。
更多关于方法
由于您使用Java处理可变数据和类,因此您需要能够将函数应用于类(实际上是类的实例),而不是期望返回值。
例如,假设我们正在处理来自javax.swing
库的JFrame
。 我们可能需要做很多事情,而不是用它 (你通常用值来操作,而不是用函数式语言操作)。 我们可以像这样:
(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
及其朋友。 我不经常使用它们,但是当我需要时,它们可以是非常宝贵的。 事实上,我自己仍然在理解他们。
那里有很多,但它主要是数量而不是复杂性的问题。 这不是一个坏问题。
补充阅读:
- 静态还是非静态? ;; 统计与非静态方法的指南
- Java类库 ;; 一个很好的图片概述了那里的东西
- JavaDocs ;; 以上链接
- Clojure Java Interop Docs ;; 来自Clojure网站
- 最佳Java书籍 ;; 按照clartaq的回答
真的,任何好的Java书都可以帮助你入门。 例如,查看有关人们迄今为止阅读过的最佳Java书籍问题的答案。 那里有很多好的资源。
一旦你掌握了一点Java,使用它只需要简单的Clojure语法。
掌握大量Java库的内容比确定如何在Clojure中使用它们要大得多。
我的第一个问题是:你到底需要什么? 那里有许多Java库。 或者您只需要标准库? 在这种情况下, dbyrne给出的答案应该足够了。
请记住,一般来说,最好使用Clojure数据结构,如序列而不是Java等价物。
从Sun(现在的Oracle)Java教程开始: http : //download.oracle.com/javase/tutorial/index.html
然后深入研究Java 6 API文档: http : //download-llnw.oracle.com/javase/6/docs/
然后在#clojure IRC或邮件列表上提问,并阅读博客。
为了深入了解Java语言,我推荐Bruce Eckel 在Java中的自由思考 : http : //www.mindview.net/Books/TIJ/
我认为普通的旧Java 6 API规范应该是你所需要的。