官网:https://www.hutool.cn/
官方原话
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。
依旧是官网的原话
Hutool的目标是使用一个工具方法代替一段复杂代码,从而最大限度的避免“复制粘贴”代码的问题,彻底改变我们写代码的方式。
以计算MD5为例:
Hutool的存在就是为了减少代码搜索成本,避免网络上参差不齐的代码出现导致的bug。
既然说了hutool是一个工具包,那他到底能封装了哪些
一个Java基础工具类,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类,同时提供以下组件:
模块 | 介绍 |
---|---|
hutool-aop | JDK动态代理封装,提供非IOC下的切面支持 |
hutool-bloomFilter | 布隆过滤,提供一些Hash算法的布隆过滤 |
hutool-cache | 简单缓存实现 |
hutool-core | 核心,包括Bean操作、日期、各种Util等 |
hutool-cron | 定时任务模块,提供类Crontab表达式的定时任务 |
hutool-crypto | 加密解密模块,提供对称、非对称和摘要算法封装 |
hutool-db | JDBC封装后的数据操作,基于ActiveRecord思想 |
hutool-dfa | 基于DFA模型的多关键字查找 |
hutool-extra | 扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等) |
hutool-http | 基于HttpUrlConnection的Http客户端封装 |
hutool-log | 自动识别日志实现的日志门面 |
hutool-script | 脚本执行封装,例如Javascript |
hutool-setting | 功能更强大的Setting配置文件和Properties封装 |
hutool-system | 系统参数调用封装(JVM信息等) |
hutool-json | JSON实现 |
hutool-captcha | 图片验证码实现 |
hutool-poi | 针对POI中Excel和Word的封装 |
hutool-socket | 基于Java的NIO和AIO的Socket封装 |
hutool-jwt | JSON Web Token (JWT)封装实现 |
可以根据需求对每个模块单独引入,也可以通过引入hutool-all
方式引入所有模块。
其实是很简单的代码
那天在群里,碰到一个需求,是一个类似请假的场景,每天可以请假好几次嘛,如果时间段内有请假,就不能发起,需求其实很简单,就是判断时间段是否重复.翻了下hutool的文档,暂时没发现有,于是就写了个测试代码
package com.huahua.api;
import lombok.Data;
import org.junit.jupiter.api.Test;
import java.time.LocalDateTime;
import java.util.ArrayList;
/**
* @author LoveHuahua
* @date 2022年01月19日 19:20
* @description believe in yourself
*/
public class TestSameTime {
@Test
public void test() {
//真实请假数据
LocalDateTime realStartTime = LocalDateTime.of(2022, 1, 1, 11, 49, 10);
LocalDateTime realEndTime = LocalDateTime.of(2022, 1, 1, 12, 0, 10);
boolean test1 = checkTest(realStartTime, realEndTime);
//断言这里是false
assert !test1;
LocalDateTime realStartTime2 = LocalDateTime.of(2022, 1, 1, 11, 51, 10);
LocalDateTime realEndTime2 = LocalDateTime.of(2022, 1, 1, 12, 0, 10);
boolean test2 = checkTest(realStartTime2, realEndTime2);
//断言这里是true
assert test2;
}
public boolean checkTest(LocalDateTime realStartTime, LocalDateTime realEndTime3) {
ArrayList<QingJiaDate> times = new ArrayList<>();
LocalDateTime oneStartTime = LocalDateTime.of(2022, 1, 1, 10, 10, 10);
LocalDateTime oneEndTime = LocalDateTime.of(2022, 1, 1, 11, 10, 10);
QingJiaDate qingJiaDate = new QingJiaDate();
qingJiaDate.setStartTime(oneStartTime);
qingJiaDate.setEndTime(oneEndTime);
LocalDateTime oneStartTime2 = LocalDateTime.of(2022, 1, 1, 11, 20, 10);
LocalDateTime oneEndTime2 = LocalDateTime.of(2022, 1, 1, 11, 30, 10);
QingJiaDate qingJiaDate2 = new QingJiaDate();
qingJiaDate2.setStartTime(oneStartTime2);
qingJiaDate2.setEndTime(oneEndTime2);
LocalDateTime oneStartTime3 = LocalDateTime.of(2022, 1, 1, 11, 40, 10);
LocalDateTime oneEndTime3 = LocalDateTime.of(2022, 1, 1, 11, 50, 10);
QingJiaDate qingJiaDate3 = new QingJiaDate();
qingJiaDate3.setStartTime(oneStartTime3);
qingJiaDate3.setEndTime(oneEndTime3);
times.add(qingJiaDate);
times.add(qingJiaDate2);
times.add(qingJiaDate3);
boolean check = true;
for (QingJiaDate time : times) {
if (realEndTime3.isBefore(time.getStartTime()) || realStartTime.isAfter(time.getEndTime())) {
continue;
}
check = false;
}
if (check) {
System.out.println("时间段可以请假");
} else {
System.out.println("时间段不能请假");
}
return check;
}
/**
* 请假数据
*/
@Data
class QingJiaDate {
private LocalDateTime startTime;
private LocalDateTime endTime;
}
}
大概就是创建了一个集合,然后初始化了几个数据,之后模拟了两个请假的时间段,并且使用肉眼判断时间段是否符合要求,然后加上断言,形成的测试案例,按逻辑是正常的
测试之后开始提交pr
LocalDateTime::now
文章到这里肯定没有结束
首先是pr的过程中,这里我放下截图
我不是很能理解这个pr提交的时候,好像有其他人的提交,这里先记录下,有人指点了我补充
这里也能看出作者的细心,或者是我的粗心吧
后面我考虑了下,如果目的是将LocalDateTime.now()
转成LocalDateTime::now
完全是多此一举,或者技术不够成熟,我没想到他的应用场景
//ChronoLocalDateTime是一个接口,定义如下
public interface ChronoLocalDateTime<D extends ChronoLocalDate>
extends Temporal, TemporalAdjuster, Comparable<ChronoLocalDateTime<?>> {
}
实现类只有两个
//ChronoLocalDate也是一个接口
public interface ChronoLocalDate
extends Temporal, TemporalAdjuster, Comparable<ChronoLocalDate> {
接下来看LocalDateTime
的定义
public final class LocalDateTime
implements Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable {
}
而我们方法用到的两个LocalDateTime
的方法分别是isAfter
和isBefore
,而这两个定义在ChronoLocalDateTime
这个接口中,我们无需关心LocalDateTime
的逻辑,也无需指定入参一定是它,直接改成传递接口,来实现更好的通用性
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有