clojureからJavaを使う

clojureJavaの呼び出し方を調べたのでそのメモです。

使用するJavaクラスをインポートするには、 import フォームを使います。 https://clojuredocs.org/clojure.core/import

user=> (import '(java.io File))
java.io.File

パッケージ名とクラス名の間にスペースが必要になることに注意が必要かと。また、複数のクラスを列挙することもできます。

user=> (import '(java.io File FileInputStream FileOutputStream))
java.io.FileOutputStream

new を使うことで、クラスをインスタンス化できます。 https://clojuredocs.org/clojure.core/new

(def f (new File "."))
#'user/f

. でメソッドを呼び出します。 https://clojuredocs.org/clojure.core/_.

user=> (. f exists)
true
user=> (. f getAbsoluteFile)
#object[java.io.File 0x7dd3f72c "/home/vagrant/."]

クラスメソッドも同様の手段で呼び出すことができます。

user=> (import '(java.time LocalDate))
java.time.LocalDate
user=> (. LocalDate now)
#object[java.time.LocalDate 0x6b1e1660 "2022-11-06"]

少し寄り道して今日の日付から10日後の日付を返す関数を定義してみます。

user=> (defn days-add-from-now [days]
  #_=>   (-> (. LocalDate now)
  #_=>       (. plusDays days)))
#'user/days-add-from-now
user=> (days-add-from-now 10)
#object[java.time.LocalDate 0x4eccadd1 "2022-11-16"]

上記の関数は次の関数と等価のはず。

user=> (defn days-add-from-now [days]
  #_=>   (. (. LocalDate now) plusDays days))
#'user/days-add-from-now
user=> (days-add-from-now 10)
#object[java.time.LocalDate 0x1880b005 "2022-11-16"]