用于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函数,如proxyreify以及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规范应该是你所需要的。