函数式就是那么简单-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包并测试 方法 

你可能感兴趣的:(函数式就是那么简单-01:clojure与java相生相爱)