# 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