clojureでJavaの呼び出し方を調べたのでそのメモです。
使用する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"]