资讯专栏INFORMATION COLUMN

Clojure使用Java方法

Yuqi / 2012人阅读

摘要:链式代码通常要求操作有返回值,但对于很多操作大都是型,什么也不返回,这样就很难链起来了我们在中这样来写语法实例放入中是推荐的写法,也就是前面加上访问一个类的内部类用如下形式

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64878.html

相关文章

  • JVM 平台上的各种语言的开发指南[z]

    摘要:我们的目标是建立对每一种语言的认识,它们是如何进化的,未来将走向何方。有点的味道是坚持使用动态类型,但唯一还收到合理拥泵的编程语言,然而一些在企业的大型团队中工作的开发者择认为这会是的一个缺陷。 为什么我们需要如此多的JVM语言? 在2013年你可以有50中JVM语言的选择来用于你的下一个项目。尽管你可以说出一大打的名字,你会准备为你的下一个项目选择一种新的JVM语言么? 如今借助来自...

    phodal 评论0 收藏0
  • Intellij + Cursive: 最佳 Clojure/Java 开发环境组合

    摘要:直到上个月重新发现的组合自然是大名鼎鼎的,多年来一直享有真正程序员最佳的美誉,但直到这个的出现和接近成熟,它的威力才能被我们享有。完全与一致水平并集成的调试能力。使用了一个多月,对这套感觉仍然好极了,的最佳开发环境,没有之一。 几乎从 Clojure 诞生时候起,它的标准开发环境就是 Emacs,对 Lisp 的亲近感、slime 对 Lisp 系列语言的支持、paredit 等 Li...

    Rocture 评论0 收藏0
  • 从一小段代码看 ClojureJava 解决问题的差异

    摘要:的解法程序猿的世界,代码说明一切,我们直接上代码吧,算法的入口是一个名为函数不知道能完全看懂上面代码的人有多少。程序猿的语言世界真的好复杂 首先声明一点,这篇短文不是要挑起语言之间的关于孰优孰劣的论战,只是希望通过一个小需求,让大家能够对比体会一下函数式编程和面向对象编程的差异(包括理念和语法上的)。 Clojure 是什么? Clojure 是运行在 Java 虚拟机(J...

    aaron 评论0 收藏0
  • Java 8函数式编程》作者Richard Warbourton:Java的亮点不是语言本身

    摘要:根据对社区和新特性的深刻理解,他创作了函数式编程一书。问你在伦敦社区的经历是否帮助你创作了函数式编程这本书绝对是这样。我认为引入函数式编程会为很多编程任务提供方便。问之前的是面向对象的,现在全面支持函数式编程。 非商业转载请注明作译者、出处,并保留本文的原始链接:http://www.ituring.com.cn/article/199271 Richard Warburto...

    mzlogin 评论0 收藏0

发表评论

0条评论

Yuqi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<