用于Clojure用户的Java

pro*_*eek 14 java api clojure

我一直在使用Lisp,而且我正在追赶clojure.关于clojure的好处是我可以自然地使用所有的java函数,而关于clojure的坏处也是我必须自然地了解java函数.

例如,我不得不花一些时间(谷歌搜索)在Java中找到方形函数(数学/ sqrt in clojure表示法).

对于那些不熟悉Java的clojure用户,你能为我推荐一些Java函数(库)的好信息资源吗?

它可以是任何东西 - 好书,网页,论坛或其他.

Isa*_*aac 29

我第一次使用Clojure时遇到了类似的问题.我几年前做过一些Java开发,但对那里的库仍然很不熟悉.

介绍

我发现使用Java的最简单方法是不是真的使用它.我认为开始使用Clojure中的Java会有一点书.除非你真正开始进入JVM/Java库,否则你真的不需要知道多少.让我解释.

花更多时间学习如何在内部和外部使用Clojure,并熟悉Clojure-Contrib.例如,在clojure.contrib sqrt 中的generic.math函数中.

你需要的许多东西实际上已经在Clojure中 - 但仍然有很多不是.

熟悉Clojure中使用Java的调用约定和语法糖.例如Math/sqrt,根据您的示例,sqrt从类中调用静态方法(基本上只是一个函数)Math.

无论如何,如果您发现自己真的需要使用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.
Run Code Online (Sandbox Code Playgroud)

所以你可以看到那里发生了什么.你"建立"了一个Double带有价值的新东西1.2,这是一个双倍的.那里有点混乱,但真的是Double是一个代表Double的类,可以做与双打有关的事情.

静态方法

例如,要从字符串中解析Double值,我们可以使用静态方法(意味着我们不需要特定的实例Double,我们可以像调用它一样调用它sqrt)parseDouble(String s):

(Double/parseDouble "1.2") => 1.2
Run Code Online (Sandbox Code Playgroud)

不要在那里狡猾.

非静态方法

假设我们想要使用我们初始化为某些东西的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"
Run Code Online (Sandbox Code Playgroud)

所以现在我们使用的方法不是静态的,需要一个真实的实时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.
Run Code Online (Sandbox Code Playgroud)

所以这里我们有一个返回字符串的方法(如定义中public之后的"String"所示,并且没有参数.但是等等!它确实需要一个参数.在Python中,它是隐式参数self:这是this在Java中调用的.

我们也可以使用这样的方法:(.toUpper (String. "Hey there"))得到相同的结果.

更多关于方法

由于您使用Java处理可变数据和类,因此您需要能够将函数应用于Classes(实际上是Classes的实例)而不期望返回值.

例如,假设我们正在处理JFrame来自javax.swing图书馆的a.我们可能需要做一些事情它,而不是与它(通常在操作值,而不是函数式语言它们).我们可以像这样:

(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 
Run Code Online (Sandbox Code Playgroud)

doto只需将其第一个参数传递给您提供的所有其他函数,并将其作为第一个参数传递给它们.所以在这里我们只是做了很多事情JFrame不返回什么特别.所有这些方法都被列为JFrame文档中的方法(或其超类......不用担心那些).

包起来

这应该为您现在自己探索JavaDocs做好准备.在这里,您将找到标准Java 1.6安装中可用的所有内容.会有新的概念,但快速的Google搜索应该可以回答您的大部分问题,并且您可以随时回到特定的问题.

一定要看着对方的重要Clojure的功能,如proxyreify以及extend-type和它的朋友.我不经常使用它们,但是当我需要时,它们可以是非常宝贵的.事实上,我自己仍然在理解他们.

那里有很多,但它主要是数量而不是复杂性的问题.这不是一个坏问题.

补充阅读: