前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Clojure使用Java方法Clojure使用Java方法

Clojure使用Java方法Clojure使用Java方法

作者头像
一个会写诗的程序员
发布2018-08-20 10:57:34
1.4K0
发布2018-08-20 10:57:34
举报

Clojure使用Java方法

Clojure有个很强大的功能,就是你可以使用Lisp语言风格无缝调用java api(java interop).这无疑是如虎添翼.

调用一个Java对象的方法

语法:

代码语言:javascript
复制
.method-name object-value args ...
代码语言:javascript
复制
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,形如:

代码语言:javascript
复制
(. object-expr-or-classname-symbol method-or-member-symbol optional-args*)  

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

语法如下:

代码语言:javascript
复制
(set! (.member-variable object-variable) new-value)

比如

代码语言:javascript
复制
user=> (import java.awt.Point)
java.awt.Point
user=> (let [pt (Point. 0 10)]
  #_=> (set! (.y pt) 100)
  #_=> (.y pt));
100 

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

用/分开类和成员

代码语言:javascript
复制
user=> (java.lang.Math/abs -3)
3
user=> (java.lang.Math/pow 2 10)
1024.0

创建一个对象

两种方法

代码语言:javascript
复制
(Class-name. arg1 arg2 ...) 

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

还有就是

代码语言:javascript
复制
(new Class-name arg1 arg2 ...)

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

代码语言:javascript
复制
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中这样来写

代码语言:javascript
复制
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

语法

代码语言:javascript
复制
(import [package.name1 ClassName1 ClassName2]  
        [package.name2 ClassName3 ClassName4]) 

实例

代码语言:javascript
复制
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:

代码语言:javascript
复制
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"

访问一个类的内部类

用如下形式:

代码语言:javascript
复制
package.class-name$inner-class
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.06.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Clojure使用Java方法
    • 调用一个Java对象的方法
      • 设置一个Java对象的公有成员变量
        • 调用静态公有成员变量/函数
          • 创建一个对象
            • 连续调用一个对象的方法
              • import java package
                • 访问一个类的内部类
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档