Clojure - Java 接口

我们已经知道,Clojure 代码最终运行在 Java 虚拟环境上。 因此,Clojure 能够利用 Java 的所有功能才有意义。 本章我们来讨论Clojure和Java之间的关联。

调用Java方法

可以使用点符号来调用 Java 方法。 一个例子是字符串。 由于 Clojure 中的所有字符串都是 Java 字符串,因此您可以对字符串调用普通的 Java 方法。

以下程序显示了如何完成此操作的示例。

示例

(ns Project
   (:gen-class))
(defn Example []
   (println (.toUpperCase "Hello World")))
(Example)

上面的程序产生以下输出。 从代码中你可以看到,如果你只为任何字符串方法调用点表示法,它在 Clojure 中也能工作。

输出

HELLO WORLD

使用参数调用 Java 方法

您还可以调用带参数的 Java 方法。 以下程序显示了如何完成此操作的示例。

示例

(ns Project
   (:gen-class))
(defn Example []
   (println (.indexOf "Hello World","e")))
(Example)

上面的程序产生以下输出。 从上面的代码中您可以看到,我们将参数"e"传递给了indexOf方法。 上述程序产生以下输出。

输出

1

创建 Java 对象

可以使用"new"关键字在 Clojure 中创建对象,类似于 Java 中的操作。

以下程序显示了如何完成此操作的示例。

示例

(ns Project
   (:gen-class))
(defn Example []
   (def str1 (new String "Hello"))
   (println str1))
(Example)

上面的程序产生以下输出。 从上面的代码可以看出,我们可以使用"new"关键字从Java中现有的String类创建一个新对象。 我们可以在创建对象时传递值,就像在 Java 中一样。 上述程序产生以下输出。

输出

Hello

下面是另一个示例,展示了如何创建 Integer 类的对象并在普通 Clojure 命令中使用它们。

示例

(ns Project
   (:gen-class))
(defn Example []
   (def my-int(new Integer 1))
   (println (+ 2 my-int)))
(Example)

上面的程序产生以下输出。

输出

3

import 导入命令

我们还可以使用import命令将Java库包含在命名空间中,以便可以轻松访问类和方法。

以下示例展示了如何使用导入命令。 在示例中,我们使用 import 命令从 java.util.stack 库导入类。 然后我们就可以按原样使用栈类的push和pop方法了。

示例

(ns Project
   (:gen-class))
(import java.util.Stack)
(defn Example []
   (let [stack (Stack.)]
   (.push stack "First Element")
   (.push stack "Second Element")
   (println (first stack))))
(Example)

上面的程序产生以下输出。

输出

First Element

使用 Java 命令运行代码

Clojure 代码可以使用 Java 命令运行。 以下是如何完成此操作的语法。

java -jar clojure-1.2.0.jar -i main.clj

您必须提及 Clojure jar 文件,以便所有基于 Clojure 的类都将加载到 JVM 中。 'main.clj'文件是需要执行的Clojure代码文件。

Java 内置函数

Clojure 可以使用 Java 的许多内置函数。 其中一些是 −

Math PI 数学函数 − Clojure可以使用Math方法来求PI的值。 以下是示例代码。

示例

(ns Project
   (:gen-class))
(defn Example []
   (println (. Math PI)))
(Example)

上面的代码产生以下输出。

输出

3.141592653589793

System 系统属性 − Clojure 还可以查询系统属性。 以下是示例代码。

示例

(ns Project
   (:gen-class))
(defn Example []
   (println (.. System getProperties (get "java.version"))))
(Example)

根据系统上Java的版本,将显示相应的值。 以下是示例输出。

输出

1.8.0_45