Clojure有個很強大的功能,就是你能夠使用Lisp語言風格無縫調用java api(java interop).這無疑是如虎添翼.java
語法:編程
.method-name object-value args ...
user=> (.toUpperCase "hello,clojure") "HELLO,CLOJURE" user=> (.indexOf "hello,clojure" "j") 9 user=> (. "hello,clojure" indexOf "j") 9 com.lightsword=> (.. System (getProperties)(get "os.name")) "Mac OS X" com.lightsword=> (.substring "hello,clojure" 6) "clojure"
其實都使用的是dot operator,形如:api
(. object-expr-or-classname-symbol method-or-member-symbol optional-args*)
語法以下:函數
(set! (.member-variable object-variable) new-value)
好比spa
user=> (import java.awt.Point) java.awt.Point user=> (let [pt (Point. 0 10)] #_=> (set! (.y pt) 100) #_=> (.y pt)); 100
用/分開類和成員.net
user=> (java.lang.Math/abs -3) 3 user=> (java.lang.Math/pow 2 10) 1024.0
兩種方法code
(Class-name. arg1 arg2 ...)
注意,類名後面有個.(a dot)這個最經常使用;orm
還有就是對象
(new Class-name arg1 arg2 ...)
new的後面類名,構造函數裏面的參數不須要使用括號()get
user=> (String. "Clojure!") "Clojure!" user=> (new String("Clojure")) ClassCastException java.lang.String cannot be cast to clojure.lang.IFn user/eval1266 (form-init7793881567968869401.clj:1) user=> (new String "Clojure") "Clojure"
將多個操做(多行代碼)經過點號"."連接在一塊兒成爲一句代碼,咱們稱之爲"鏈式編程風格"。 鏈式代碼一般要求操做有返回值, 但對於不少操做大都是void型,什麼也不返回,這樣就很難鏈起來了.
咱們在Clojure中這樣來寫
user=> (doto (java.util.Stack.) #_=> (.push "Hello!") #_=> (.push "Clojure.") #_=> ) ["Hello!" "Clojure."] com.lightsword=> (doto (java.util.HashMap.)(.put "k" 1)(.put "v" 2)) {"v" 2, "k" 1}
語法
(import [package.name1 ClassName1 ClassName2] [package.name2 ClassName3 ClassName4])
實例
user=> (import [java.util Date Stack] #_=> [java.net Proxy URI]) java.net.URI user=> (Date.) #inst "2016-06-28T15:19:05.923-00:00"
放入namespace中是推薦的寫法,也就是前面加上ns:
user=> (ns com.lightsword #_=> (:import [java.util Date Stack] #_=> [java.net Proxy URI]) #_=> ) nil com.lightsword=> (Date.) #inst "2016-06-28T15:21:43.048-00:00"
用以下形式:
package.class-name$inner-class