| 接口 | 说明 |
|---|---|
| Func |
lambda 函数工具箱,主要用来解决 JDK 函数接口参数过少的问题,同时还降低了学习成本
JDK java.util.function 包里面的函数接口有如下缺点:
1:设计繁琐,相比动态语言的闭包在理解和学习成本上要高
2:函数支持的参数过少,超过两个参数时就没法使用了
3:基于 java 接口的闭包实现方案,转移了用户对于函数本身这个核心要点的关注,
接口名、方法名带来了噪声干扰
|
| Func.F00 |
0 参 0 返回函数
|
| Func.F01<R> |
0 参 1 返回函数
|
| Func.F10<T> |
1 参 0 返回函数
|
| Func.F11<T,R> |
1 参 1 返回函数
|
| Func.F20<T,U> |
2 参 0 返回函数
|
| Func.F21<T,U,R> |
2 参 1 返回函数
|
| Func.F30<T,U,V> |
3 参 0 返回函数
|
| Func.F31<T,U,V,R> |
3 参 1 返回函数
|
| Func.F40<T,U,V,W> |
4 参 0 返回函数
|
| Func.F41<T,U,V,W,R> |
4 参 1 返回函数
|
| Func.F50<T,U,V,W,X> |
5 参 0 返回函数
|
| Func.F51<T,U,V,W,X,R> |
5 参 1 返回函数
|
| Func.F60<T,U,V,W,X,Y> |
6 参 0 返回函数
|
| Func.F61<T,U,V,W,X,Y,R> |
6 参 1 返回函数
|
| Func.F70<T,U,V,W,X,Y,Z> |
7 参 0 返回函数
|
| Func.F71<T,U,V,W,X,Y,Z,R> |
7 参 1 返回函数
|
| 类 | 说明 |
|---|---|
| AesKit |
完全兼容微信所使用的AES加密方式。
|
| Base64Kit | |
| CPI |
用于定制个性化 Ret
例子:
CPI.setRetState("success", true, false);
将 Ret 的状态字段名由 "state" 改为 "success",将状态值 "ok" 改为 true、"fail" 改为 false
CPI.setRetState("code", 200, 500);
将 Ret 的状态字段名由 "state" 改为 "code",将状态值 "ok" 改为 200、"fail" 改为 500
CPI.setRetMsg("message")
将 Ret 的消息字段名由 "msg" 改为 "message"
|
| ElKit |
EL 表达式语言求值工具类
1:不带参示例
Integer value = ElKit.eval("1 + 2 * 3");
2:带参示例
Kv data = Kv.by("a", 2).set("b", 3);
Integer value = ElKit.eval("1 + a * b", data);
|
| ElKit.InnerEvalDirective | |
| FileKit |
FileKit.
|
| HandlerKit |
HandlerKit.
|
| HashKit | |
| HttpKit |
HttpKit
|
| ImageKit | |
| JavaKeyword |
JavaKeyword.
|
| JsonKit |
JsonKit.
|
| Kv |
Kv (Key Value)
Example:
Kv para = Kv.by("id", 123);
User user = user.findFirst(getSqlPara("find", para));
|
| LogKit |
LogKit.
|
| Okv |
Okv (Ordered Key Value)
Okv 与 Kv 的唯一区别在于 Okv 继承自 LinkedHashMap,而 Kv 继承自 HashMap
所以对 Okv 中的数据进行迭代输出的次序与数据插入的先后次序一致
Example:
Okv para = Okv.by("id", 123);
User user = user.findFirst(getSqlPara("find", para));
|
| PathKit |
new File("..
|
| Prop |
Prop.
|
| PropKit |
PropKit.
|
| ReflectKit |
反射工具类
|
| Ret |
Ret 用于返回值封装,也用于服务端与客户端的 json 数据通信
一、主要应用场景:
1:业务层需要返回多个返回值,例如要返回业务状态以及数据
2:renderJson(ret) 响应 json 数据给客户端
二、实例
1:服务端
Ret ret = service.justDoIt(paras);
renderJson(ret);
2:javascript 客户端 ajax 回调函数通常这么用:
success: function(ret) {
if(ret.state == "ok") {
...
}
if (ret.state == "fail") {
...
}
}
3:普通应用程序通常这么用:
String json = HttpKit.readData(getRequest());
Ret ret = FastJson.getJson().parse(json, Ret.class);
if (ret.isOk()) {
...
}
if (ret.isFail()) {
...
}
三、定制 Ret
1:将状态字段名由 "state" 改为 "success",将状态值 "ok" 改为 true、"fail" 改为 false
CPI.setRetState("success", true, false);
2:将状态字段名由 "state" 改为 "code",将状态值 "ok" 改为 200、"fail" 改为 500
CPI.setRetState("code", 200, 500);
3:将消息字段名由 "msg" 改为 "message"
CPI.setRetMsg("message")
|
| ScheduledKit |
调度工具类
1:scheduleWithFixedDelay 以上一次任务的 "结束时间" 为间隔调度任务
2:scheduleAtFixedRate 以上一次任务的 "开始时间" 为间隔调度任务。
|
| StrKit |
StrKit.
|
| SyncWriteMap<K,V> |
SyncWriteMap 同步写 HashMap
创建原因是 HashMap扩容时,遇到并发修改可能造成 100% CPU 占用
SyncWriteMap 拥有 HashMap 的性能,但不保障并发访问的线程安全
只用于读多写少且不用保障线程安全的场景
例如 MethodKit 中用于缓存 MethodInfo 的 cache,被写入的数据
不用保障是单例,读取之后会做 null 值判断
ActionMapping 中的 HashMap 是系统启动时在独立线程内初始化的,
不存在并发写,只存在并发读的情况,所以仍然可以使用 HashMap
|
| ThreadPoolKit |
ThreadPoolKit
execute 与 submit(核心区别:前者提交不需要返回值的任务,后者提交需要返回值的任务)
0: submit 会吃掉 task 中的异常,所以需要在 task 的 run/call 方法中使用 try catch
对异常做日志
确切地说 submit 方式是将 task 中的异常暂存起来,如果后续调用其返回值的 Future.get() 方法,
暂存的异常会被抛出来,可以通过 try catch 得到异常
execute 方式会直接向外层抛出 task 中的异常,并且会丢掉原有线程,新建线程用于后续调度,
所以也要用 try catch 来保障不对上层抛出异常
总的来说,都要使用 try catch 管理异常,做好日志
1:submit 方法仅仅是对 Callable、Runnable 参数进行包装,最终仍然是转调了 execute 方法提交线程,
从而会有轻微的性能损耗。
|
| TimeKit |
TimeKit 用于简化 JDK 8 新增的时间 API
新旧日期转换通过桥梁 Instant 进行,转成 LocalDate、LocalTime 需要先转成 LocalDateTime:
新转旧:LocalDateTime.atZone(ZoneId).toInstant() -> Instant -> Date.from(Instant)
旧转新:Date.toInstant() -> Instant -> LocalDateTime.ofInstant(Instant, ZoneId)
经测试,SimpleDateFormat 比 DateTimeFormatter 对 pattern 的支持更好
对于同样的 pattern 值 "yyyy-MM-dd HH:mm:ss",前者可以转换 "2020-06-9 12:13:19"
后者却不支持,原因是 pattern 的 dd 位置只有数字 9,必须要是两位数字才能支持
所以:建议优先使用转换结果为 Date 的 parse 方法,使用 SimpleDateFormat 来转换
|
Copyright © 2022. All rights reserved.