Clojure使用Java方法

Clojure使用Java方法

Clojure有個很強大的功能,就是你能夠使用Lisp語言風格無縫調用java api(java interop).這無疑是如虎添翼.java

調用一個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*)

設置一個Java對象的公有成員變量

語法以下:函數

(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 java package

語法

(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
相關文章
相關標籤/搜索