Clojure使用Java方法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 条评论
登录 后参与评论

相关文章

来自专栏公众号文章

Golang 入门系列(四)如何理解interface接口

前面讲了很多Go 语言的基础知识,包括go环境的安装,go语言的语法等,感兴趣的朋友,可以先看看之前的文章。https://www.cnblogs.com/zh...

842
来自专栏大数据学习笔记

Java程序设计(Java9版):第2章 数据类型与运算符(Data types and Operators)

第2章 数据类型与运算符(Data types and Operators) I think everybody in this country should ...

2635
来自专栏个人随笔

Java 关于集合框架那点事儿

 1.引入集合框架   采用数组存在的一些缺陷:    1.数组长度固定不变,不能很好地适应元素数量动态变化的情况。    2.可通过数组名.length获取数...

29610
来自专栏androidBlog

笔试题—字符串常见的算法题集锦

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

1621
来自专栏软件开发

JavaSE学习总结(八)—— 异常处理(Exception)

一、理解异常及异常处理的概念 异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。 异常不是错误 程序中关键的位置有异常处理,提高程序的稳定...

2339
来自专栏小工匠技术圈

【小工匠聊密码学】-- Base64算法

1453
来自专栏Android相关

Kotlin---接口与继承

同样在Kotlin中也有接口的概念,与Java不同的是,Kotlin中的接口可以定义变量,但是不能为变量提供构造函数,也可以实现函数体,如果没有实现的函数,默认...

1743
来自专栏静晴轩

类数组借用数组方法

于JavaScript如何将对象转化为数组对象,其用法写法已经很常见且完善,比如JQuery中的makeArray函数对此的实现,也是跟大家想的差不多,只是考虑...

3609
来自专栏GreenLeaves

C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能

1、IEnumerator和IEnumerable的作用 其实IEnumerator和IEnumerable的作用很简单,就是让除数组和集合之外的类型也能支持f...

20710
来自专栏指尖下的Android

二进制的运算

在计算机中存储字节是定长的,即我们8、16、32位等等,6的二进制位为110,但如果在8位计算机中是00000110,高位补零

2363

扫码关注云+社区

领取腾讯云代金券