# hutool-plus
**Repository Path**: ssoss/hutool-plus
## Basic Information
- **Project Name**: hutool-plus
- **Description**: Hutool-Plus是基于Hutool开源项目,进行功能增强的开源项目。 Hutool-Plus是一个功能丰富且易用的Java工具库,通过诸多实用工具类的使用,旨在帮助开发者快速、便捷地完成各类开发任务。 这些封装的工具涵盖了字符串、数字、集合、编码、日期、文件、IO、加密、数据库JDBC、JSON、HTTP客户端等一系列操作, 可以满足各种不同的开发需求。
- **Primary Language**: Java
- **License**: MulanPSL-2.0
- **Default Branch**: v5-master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2024-07-11
- **Last Updated**: 2025-10-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 📚简介
`Hutool-Plus`是基于Hutool开源项目,进行功能增强的开源项目。 `Hutool-Plus`是一个功能丰富且易用的**Java工具库**,通过诸多实用工具类的使用,旨在帮助开发者快速、便捷地完成各类开发任务。
这些封装的工具涵盖了字符串、数字、集合、编码、日期、文件、IO、加密、数据库JDBC、JSON、HTTP客户端等一系列操作,
可以满足各种不同的开发需求。
-------------------------------------------------------------------------------
## 📦安装
### 🍊Maven
在项目的pom.xml的dependencies中加入以下内容:
```xml
io.gitee.ssoss
hutool-plus-all
5.9.0
```
### 🍐Gradle
```
implementation 'io.gitee.ssoss:hutool-plus-all:5.9.0'
```
### 📥下载jar
点击以下链接,下载`hutool-all-X.X.X.jar`即可:
- [Maven中央库](https://repo1.maven.org/maven2/cn/hutool-plus/hutool-all/5.9.0/)
> 🔔️注意
> Hutool-Plus 5.x支持JDK8+,对Android平台没有测试,不能保证所有工具类或工具方法可用。
### 🚽编译安装
访问Hutool-Plus的Gitee主页:[https://gitee.com/ssoss/hutool](https://gitee.com/ssoss/hutool-plus) 下载整个项目源码(v5-master或v5-dev分支都可)然后进入Hutool-Plus项目目录执行:
```sh
./hutool.sh install
```
然后就可以使用Maven引入了。
-------------------------------------------------------------------------------
### ⌨️使用
#### 1. Bean拷贝:自定义属性拷贝 与 默认属性转换
```Java
/**
* 源对象
*/
@Data
static class SysUser implements Serializable {
private static final long serialVersionUID = 1L;
private String depId;
private String customerId;
/**
* Double类型的value
*/
private Double value;
}
/**
* 目标对象
*/
@Data
@Setter
static class SysUserVO implements Serializable {
private static final long serialVersionUID = 1L;
private Long depart;
private Double orgId;
/**
* String类型的value
*/
private String value;
}
/**
* 测试自定义转换器
* @author lingengkeng
*/
@Test
public void toBeanTest1(){
// 创建源对象
final SysUser sysUser = new SysUser();
sysUser.setDepId("123");
sysUser.setCustomerId("456");
sysUser.setValue(1d);
final SysUserVO sysUserVO = BeanUtil.toBean(sysUser, SysUserVO.class, (source, target) -> {
target.setDepart(666L);
// target.setValue(source.getValue());
target.setOrgId(Double.valueOf(source.getCustomerId()));
});
Assert.assertEquals(Integer.valueOf(sysUser.getCustomerId()), Integer.valueOf(sysUserVO.getOrgId().intValue()));
}
```
#### 2. Bean列表拷贝:自定义属性拷贝 与 默认属性转换
```Java
/**
* 测试自定义转换器
* @author lingengkeng
*/
@Test
public void copyToListTest(){
// 创建源对象
final SysUser sysUser = new SysUser();
sysUser.setDepId("123");
sysUser.setCustomerId("456");
sysUser.setValue(1d);
final SysUser sysUser1 = new SysUser();
sysUser1.setDepId("3333");
sysUser1.setCustomerId("666");
sysUser1.setValue(2d);
// 用户列表
List sysUserList = Arrays.asList(sysUser, sysUser1);
// 列表中的对象属性值转换
List sysUserVOList = BeanUtil.copyToList(sysUserList, SysUserVO.class, (source, target) -> {
target.setOrgId(Double.valueOf(source.getCustomerId()));
// target.setValue(String.valueOf(source.getValue() + 1));
});
Assert.assertEquals(Integer.valueOf(sysUser.getCustomerId()), Integer.valueOf(sysUserVOList.get(0).getOrgId().intValue()));
}
```
#### 3. 对Map的value求和
```Java
@Data
@AllArgsConstructor
static class Person {
private Double weight;
}
@Data
@AllArgsConstructor
static class Person1 {
private Float weight;
private int height;
}
@Test
public void valueSumTest() {
// 1.求和:map的value为 数字类型,且存在null的情况
Map map = new HashMap() {{
put("1", null);
put("2", 2);
}};
double valuesSum = MapUtil.getValuesSum(map);
// 结果:2
Assert.assertEquals(2, valuesSum, 0);
// 2.求和:map的value为Person对象,属性存在null的情况
Map map1 = new HashMap() {{
put("1", new Person(5.0));
put("2", new Person(null));
}};
// 对对象weight属性求和
double valuesSum3 = MapUtil.getValuesSum(map1, Person::getWeight);
// 结果:5
Assert.assertEquals(5, valuesSum3, 0);
double valuesSum4 = MapUtil.getValuesSum(new HashMap() {{
put("1", new Person1(6f, 3));
put("2", new Person1(null, 3));
}}, Person1::getWeight); // 对对象weight属性求和
Assert.assertEquals(6, valuesSum4, 0);
}
```
### 4. 对Map的value求和,且value为列表对象
```Java
@Test
public void valueSumTest() {
// 求和:map的value,value为列表的情况
// map value为列表的情况
Map> person1Map = new HashMap(){{
put("1", new ArrayList() {{
add(new Person1(10f, 4));
add(new Person1(10f, 5));
}});
put("2", new ArrayList() {{
add(new Person1(10f, 4));
add(null);
add(new Person1(null, 4));
}});
}};
double valuesSum = MapUtil.getValuesSum(person1Map, Person1::getWeight);
Assert.assertEquals(30, valuesSum, 0);
}
```
### 5.计算相关类
```Java
@Test
public void calcTest() {
// 在很多代码里面,如果参数是null,直接使用0(当分母为0时),会导致程序异常,使用BigDecimalSupper,可以避免这个问题。
// 或者使用Optional,但是Optional在处理null值时,代码会更长,而且需要引入额外的依赖。
// BigDecimalSupper 可以处理null值,并且可以避免抛出异常,使得代码更加健壮。BigDecimal 不能处理null值,需要在代码中做空值判断。
Float a = null;
Double b = null;
Long c = null;
Integer t = null;
BigDecimal subtract = new BigDecimalSupper(a).setScale(2).divide(new BigDecimalSupper(a).setScale(2)).add(BigDecimalSupper.valueOf(b)).add(BigDecimalSupper.valueOf(1));
System.out.println(subtract);
BigDecimal subtract1 = new BigDecimalSupper(c).multiply(new BigDecimalSupper(a)).add(BigDecimalSupper.valueOf(b)).add(BigDecimalSupper.valueOf(1));
System.out.println(subtract1);
BigDecimal subtract2 = new BigDecimalSupper(t).subtract(new BigDecimalSupper(a)).add(BigDecimalSupper.valueOf(b)).add(BigDecimalSupper.valueOf(1));
System.out.println(subtract2);
// System.out.println(new BigDecimalSupper(4.503).setScale(2).divide(new BigDecimalSupper(a)));
// System.out.println(new BigDecimalSupper(4.503).setScale(2, RoundingMode.HALF_UP).divide(new BigDecimalSupper(4.503)));
// BigDecimal 默认要求除法操作的结果必须是精确的,如果结果是一个无限循环小数,就会抛出异常。以下是报错示范
// System.out.println(BigDecimal.valueOf(4.503).divide(BigDecimal.valueOf(0)));
// System.out.println(BigDecimal.valueOf(4.503).setScale(2).divide(BigDecimal.valueOf(4.503)));
}
```
-------------------------------------------------------------------------------
## 🛠️包含组件
一个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-Plus的源码分为两个分支,功能如下:
| 分支 | 作用 |
|-----------|---------------------------------------------------------------|
| v5-master | 主分支,release版本使用的分支,与中央库提交的jar一致,不接收任何pr或修改 |
| v5-dev | 开发分支,默认为下个版本的SNAPSHOT版本,接受修改或pr |
### 🐞提供bug反馈或建议
提交问题反馈请说明正在使用的JDK版本呢、Hutool-Plus版本和相关依赖库版本。
- [Gitee issue](https://gitee.com/ssoss/hutool/issues)
### 🧬贡献代码的步骤
1. 在Gitee或者Github上fork项目到自己的repo
2. 把fork过去的项目也就是你的项目clone到你的本地
3. 修改代码(记得一定要修改v5-dev分支)
4. commit后push到自己的库(v5-dev分支)
5. 登录Gitee或Github在你首页可以看到一个 pull request 按钮,点击它,填写一些说明信息,然后提交即可。
6. 等待维护者合并
### 📐PR遵照的原则
Hutool-Plus欢迎任何人为Hutool-Plus添砖加瓦,贡献代码。需要提交的pr(pull request)符合一些规范,规范如下:
1. 注释完备,尤其每个新增的方法应按照Java文档规范标明方法说明、参数说明、返回值说明等信息,必要时请添加单元测试,如果愿意,也可以加上你的大名。
2. Hutool-Plus的缩进,使用Tab键缩进。
3. 新加的方法不要使用第三方库的方法,Hutool-Plus遵循无依赖原则(除非在extra模块中加方法工具)。
4. 请pull request到`v5-dev`分支。Hutool-Plus在5.x版本后使用了新的分支:`v5-master`是主分支,表示已经发布中央库的版本,这个分支不允许pr,也不允许修改。
5. 我们如果关闭了你的issue或pr,请不要诧异,这是我们保持问题处理整洁的一种方式,你依旧可以继续讨论,当有讨论结果时我们会重新打开。
-------------------------------------------------------------------------------
## ⭐欢迎Star Hutool-Plus