【问题标题】:Java for Clojure users适用于 Clojure 用户的 Java
【发布时间】:2023-03-25 15:50:01
【问题描述】:

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

例如,我不得不花一些时间(谷歌搜索)在 Java 中查找平方函数(Clojure 表示法中的 Math/sqrt)。

您能否为不太熟悉 Java 的 clojure 用户推荐一些关于 Java 函数(库)的良好信息资源?

它可以是任何东西——好书、网页、论坛等等。

【问题讨论】:

  • 一开始我以为你想从clojure切换到java!差点心脏病发作。

标签: java api clojure


【解决方案1】:

当我第一次开始使用 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 函数,例如 proxyreify 以及 extend-type 及其朋友。我不经常使用它们,但当我需要时,它们可能是无价的。事实上,我自己仍然在理解它们。

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

补充阅读:

【讨论】:

  • +1 以获得很棒的答案。我现在想知道是否可以在 Clojure 中创建一个(java-explain someclass)函数,它会智能地告诉您如何通过反射 + JavaDoc 查找从 Clojure 调用所有方法?那时根本不需要学习任何Java!
  • 一点注意:Clojure 中的字符串已经是 Java 字符串。所以(String. "Hey there")"Hey there" 是一样的
  • Clojure contrib 现在已折旧。请更新链接。
【解决方案2】:

真的,任何优秀的 Java 书籍都可以帮助您入门。例如,请参阅有关问题的答案 best Java book people have read so far。那里有很多好的资源。

一旦你掌握了一点 Java,使用它只是简单的 Clojure 语法问题。

掌握大量 Java 库的内容比弄清楚如何在 Clojure 中使用它们是一项艰巨的任务。

【讨论】:

    【解决方案3】:

    我的第一个问题是:您到底需要什么?那里有许多 Java 库。还是您只需要标准库?这样的话dbyrne给出的答案应该就够了。

    请记住,一般而言,您最好使用 Clojure 数据结构(如序列)而不是 Java 等价物。

    【讨论】:

      【解决方案4】:

      从 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 的免费 Thinking in Javahttp://www.mindview.net/Books/TIJ/

      【讨论】:

        【解决方案5】:

        我认为普通的旧 Java 6 API Specification 应该是你所需要的。

        【讨论】:

        • 我完全不同意这一点。将 Java 新手扔进 API 只会淹没他们。 API 文档有时会产生误导。例如,看看 java.awt 包是如何声明为“包含用于创建用户界面的所有类......”甚至从未提及 Swing。虽然 API 规范是最终的参考,但它不是新手开始 IMO 的好地方。
        • @clartaq:如果他真的在学习 Java 编程,我会同意你的观点。作为 clojure 程序员,您真正需要的只是一个 java 参考。任何特定主题,如 UI 或 IO 编程,都可以根据需要进行搜索。您真的不需要阅读任何 Java 教程即可开始使用 clojure。 OTOH,我在使用 Java 十年后学习了 Clojure,所以也许我的观点不好。
        猜你喜欢
        • 1970-01-01
        • 2017-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-19
        • 2017-06-04
        • 1970-01-01
        相关资源
        最近更新 更多