函数式就是那么简单-01:clojure与java相生相爱
很多clojure初学者来自于java背景,没有完全的动力转向clojure,需要一个过渡期。
我非常理解,虽然有点痛心。
所以,且听老夫讲解如果在java里面试玩clojure。
有朝一日,你们自然会在clojure里面与java相生相爱。
第一步: 入门探路篇-java调用原生clojure库
第二步: 小试牛刀篇-java调用带壳的clojure
第三步: 登堂入室篇-clojure调java库
第四步: 信手拈来篇-clojure与java混合编译
最后: 常见问题FAQ
;; 没有安装nix的请自行安装: https://nixos.wiki/wiki/Nix_Installation_Guide
准备工作: 安装openjdk, leiningen, maven
1. 入门探路篇-java调用原生clojure库
这里我们调用clojure的base64编码库。
a. 生成java maven项目
b. 添加clojure标准库及外部库依赖
c: 下载maven依赖
d: 编写java代码调用clojure库
e: 编译并运行代码:
f: 打成jar包并运行:
第二步: 小试牛刀篇-java调用带壳的clojure
想用clojure写java库给同事用? 没问题! 开始 给clojure加壳。
这里我们用clojure编写my-codec的库,包含了Base64.encode方法。
clojure加壳端:
a. 新建clojure项目my-codec
b. 添加并下载依赖
c. 编写clojure代码
d. 对clojure壳文件添加aot编译选项
e: 打包并运行
f: 安装至本地maven库
java调用端:
a. 新建java项目:
b. 添加clojure核心库及clojure带壳库依赖并下载依赖
c. 编写java代码调用带壳的clojure
d . 编译并运行
第三步: 登堂入室篇-clojure调java库
请参见文档获取更多信息: https://clojure.org/reference/java_interop
构造对象: 后一种是语法糖
调用对象实例方法: 后一种是语法糖
调用对象静态方法: 后一种是语法糖
信调用方法总结:
a. 调用参数固定, 提示方法找不到是什么意思?
b. 调用参数变长,如何传参?
c. 调用参数需要class, 如何传参?
d: 调用参数需要接口, 如何传参?
第四步: 信手拈来篇-clojure与java混合编译
什么时候需要混合双打? java底层主导性能, clojure 上层主导灵活。
所有在这里就不得不提clojure的高并发库httpkit: https://github.com/http-kit/http-kit
web服务器性能强悍得要死, 以前交流过程中很个游戏公司采用此库,弃用java。
在这里,我们base64的加密过程由clojure委托给java实现,base64的解密过程由clojure自主实现,
b. 添加java的base64以及clojure的base64依赖库, 并添加相应源码路径后下载依赖
c. 编写java的JavaBase64类(需要使用meghanada插件可以先使用lein pom生成 maven pom文件)
d: 编译并运行java的JavaBase64类
e. 编写clojure代码
f: 生成jar包并测试 方法