Clojure使用Java方法

Clojure使用Java方法

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,形如:


(. object-expr-or-classname-symbol method-or-member-symbol optional-args*)  

设置一个Java对象的公有成员变量

语法如下:


(set! (.member-variable object-variable) new-value)

比如


user=> (import java.awt.Point)

java.awt.Point

user=> (let [pt (Point. 0 10)]

  #_=> (set! (.y pt) 100)

  #_=> (.y pt));

100 


调用静态公有成员变量/函数

用/分开类和成员


user=> (java.lang.Math/abs -3)

3

user=> (java.lang.Math/pow 2 10)

1024.0

创建一个对象

两种方法


(Class-name. arg1 arg2 ...) 

注意,类名后面有个.(a dot)这个最常用;

还有就是


(new Class-name arg1 arg2 ...)

new的后面类名,构造函数里面的参数不需要使用括号()


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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值