xml
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
1. StrUtil
java
import cn.hutool.core.util.StrUtil;
StrUtil.replace(str, " -", "")
作用: 将字符串中所有匹配的子串替换成指定内容,下面的例子会删除所有"空格加连字符"。
java
String productName = "冰箱 -一级品 -白色";
String result = StrUtil.replace(productName, " -", "");
System.out.println(result); // 冰箱一级品白色
StrUtil.subBefore(...)
作用: 截取指定分隔符之前的内容,第三个参数用于指定按最后一次还是第一次出现的分隔符截取。
java
String fileName = "2026.08.23.report.pdf";
String name = StrUtil.subBefore(fileName, ".", true);
System.out.println(name); // 2026.08.23.report
StrUtil.lowerFirst(...)
作用: 将字符串的首字符转换为小写,常用于把类名转换为 Spring 默认 Bean 名称风格。
java
String beanName = StrUtil.lowerFirst("OrderService");
System.out.println(beanName); // orderService
StrUtil.format(...)
作用: 按参数顺序替换字符串模板中的 {} 占位符,避免使用大量 + 号拼接字符串。
java
String message = StrUtil.format("用户 {} 创建了订单 {},金额为 {} 元", "张三", "ORD-1001", 299.00);
System.out.println(message); // 用户 张三 创建了订单 ORD-1001,金额为 299.0 元
StrUtil.sub(...)
作用: 按开始下标(包含)和结束下标(不包含)截取字符串,并支持负数下标从末尾倒数。
java
String orderNo = "ORDER-20260823-001";
String sequence = StrUtil.sub(orderNo, -3, orderNo.length());
System.out.println(sequence); // 001
2. ObjectUtil
java
import cn.hutool.core.util.ObjectUtil;
ObjectUtil.isNotEmpty(...)
作用: 判断对象是否具有非空内容,可用于字符串、集合、Map、数组和迭代器等常见类型。
java
List<String> roleCodes = Arrays.asList("ADMIN", "AUDITOR");
if (ObjectUtil.isNotEmpty(roleCodes)) {
System.out.println("当前用户已配置角色");
}
3. DateUtil
java
import cn.hutool.core.date.DateUtil;
DateUtil.now()
作用: 获取当前日期时间,并返回格式为 yyyy-MM-dd HH:mm:ss 的字符串。
java
String operationTime = DateUtil.now();
System.out.println(operationTime); // 例如:2026-08-23 14:30:00
4. RandomUtil
java
import cn.hutool.core.util.RandomUtil;
RandomUtil.randomEleList(...)
作用: 从列表中随机选取指定数量的元素并返回新列表,适合抽样或随机推荐场景。
java
List<String> candidates = Arrays.asList("张三", "李四", "王五", "赵六", "钱七");
List<String> winners = RandomUtil.randomEleList(candidates, 2);
System.out.println(winners); // 例如:[王五, 钱七]
5. IdUtil
java
import cn.hutool.core.util.IdUtil;
IdUtil.simpleUUID()
作用: 生成一个不含连字符的 32 位 UUID 字符串,常用于业务记录、请求或文件的唯一标识。
java
String attachmentId = IdUtil.simpleUUID();
System.out.println(attachmentId); // 例如:7f9c20fcae7541f6a5af0b594f8b87ea
6. ChronoUnit
java
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
ChronoUnit.DAYS.between(...)
作用: 计算两个兼容时间对象之间相差的完整天数,若结束时间更早则返回负数。
java
LocalDate startDate = LocalDate.of(2026, 8, 20);
LocalDate endDate = LocalDate.of(2026, 8, 23);
long days = ChronoUnit.DAYS.between(startDate, endDate);
System.out.println(days); // 3
7. BeanUtil
java
import cn.hutool.core.bean.BeanUtil;
BeanUtil.toBean(obj, Xxx.class)
作用: 将 Map 或其他 JavaBean 按属性名转换成指定类型的 JavaBean,并尝试进行兼容的字段类型转换。
java
public static class User {
private String name;
private Integer age;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
}
Map<String, Object> userMap = new HashMap<>();
userMap.put("name", "张三");
userMap.put("age", "28");
User user = BeanUtil.toBean(userMap, User.class);
System.out.println(user.getName()); // 张三
System.out.println(user.getAge()); // 28
8. SpringUtil
SpringUtil 位于 hutool-extra 模块:
java
import cn.hutool.extra.spring.SpringUtil;
SpringUtil.getBeansOfType(Agent.class)
作用: 从 Spring 容器中查找指定类型的全部 Bean,并返回以 Bean 名称为键、Bean 实例为值的 Map。
java
Map<String, Agent> agentMap = SpringUtil.getBeansOfType(Agent.class);
agentMap.forEach((beanName, agent) -> {
System.out.println("执行 Agent:" + beanName);
agent.execute();
});
使用前需确保
SpringUtil已注册到 Spring 容器中,例如通过组件扫描、显式声明 Bean 或相关自动配置完成注册。
9. CollStreamUtil
java
import cn.hutool.core.stream.CollStreamUtil;
以下示例假设 Employee 包含 getName() 和 getDepartmentId() 方法。
CollStreamUtil.toList(...)
作用: 创建一个 Stream 收集器,将流中的对象映射成目标值后收集为 List。
java
List<String> employeeNames = employees.stream()
.collect(CollStreamUtil.toList(Employee::getName));
System.out.println(employeeNames); // 例如:[张三, 李四]
CollStreamUtil.groupByKey(...)
作用: 按指定的键提取函数对集合元素分组,并返回 Map<K, List<E>>。
java
Map<Long, List<Employee>> employeesByDepartment =
CollStreamUtil.groupByKey(employees, Employee::getDepartmentId);
System.out.println(employeesByDepartment.get(10L).size()); // 例如:2
下面以 2026-08-23 为基准日,将记录分为"当天""30天内""半年内"和"1年外":
java
List<Map.Entry<String, LocalDate>> records = Arrays.asList(
new AbstractMap.SimpleEntry<>("记录A", LocalDate.of(2026, 8, 23)),
new AbstractMap.SimpleEntry<>("记录B", LocalDate.of(2026, 8, 1)),
new AbstractMap.SimpleEntry<>("记录C", LocalDate.of(2026, 5, 1)),
new AbstractMap.SimpleEntry<>("记录D", LocalDate.of(2025, 1, 1),
new AbstractMap.SimpleEntry<>("记录E", LocalDate.of(2025, 1, 2))
);
LocalDate today = LocalDate.of(2026, 8, 23);
private static String classifyTimeRange(LocalDate recordDate, LocalDate today) {
if (recordDate.equals(today)) {
return "当天";
}
+
long days = ChronoUnit.DAYS.between(recordDate, today);
if (days > 0 && days <= 30) {
return "30天内";
}
if (recordDate.isAfter(today.minusMonths(6))
|| recordDate.equals(today.minusMonths(6))) {
return "半年内";
}
if (recordDate.isBefore(today.minusYears(1))) {
return "1年外";
}
return "半年至1年";
}
Map<String, List<Map.Entry<String, LocalDate>>> recordsByTimeRange =
CollStreamUtil.groupByKey(records, record ->
classifyTimeRange(record.getValue(), today));
System.out.println("当天:" + recordsByTimeRange.get("当天"));
System.out.println("30天内:" + recordsByTimeRange.get("30天内"));
System.out.println("半年内:" + recordsByTimeRange.get("半年内"));
System.out.println("1年外:" + recordsByTimeRange.get("1年外"));
输出结果中的分组键为:
text
当天:[记录A=2026-08-23]
30天内:[记录B=2026-08-01]
半年内:[记录C=2026-05-01]
1年外:[记录D=2025-01-01,记录E=2025-01-02]
"半年内"和"1年外"之间还存在"半年至1年"的时间区间,示例已单独返回该分组,实际项目也可以按照业务要求调整或合并该区间。
10. MapUtil
java
import cn.hutool.core.map.MapUtil;
MapUtil.get(...)
作用: 根据键从 Map 中取值并转换为指定类型,还可以在键不存在或无法转换时提供默认值。
java
Map<String, Object> config = new HashMap<>();
config.put("timeout", "3000");
Integer timeout = MapUtil.get(config, "timeout", Integer.class, 1000);
System.out.println(timeout); // 3000
MapUtil.getStr(...)
作用: 根据键从 Map 中取值并转换为字符串,也可以为不存在的值提供默认字符串。
java
Map<String, Object> order = new HashMap<>();
order.put("orderNo", 20260823001L);
String orderNo = MapUtil.getStr(order, "orderNo", "UNKNOWN");
System.out.println(orderNo); // 20260823001
11. Convert
java
import cn.hutool.core.convert.Convert;
Convert.toLong(...)
作用: 将字符串、数字等对象转换为 Long,并可为 null 或转换失败的情况指定默认值。
java
String userIdText = "10086";
Long userId = Convert.toLong(userIdText, 0L);
System.out.println(userId); // 10086
Convert.toStr(...)
作用: 将任意对象转换成字符串,并可在对象为 null 时返回指定默认值。
java
BigDecimal amount = new BigDecimal("199.90");
String amountText = Convert.toStr(amount, "0.00");
System.out.println(amountText); // 199.90
实际项目应统一管理 ${hutool.version},并以项目当前锁定的 Hutool 版本为准。
官方参考
- Hutool API 文档:https://plus.hutool.cn/apidocs/
- Hutool
StrUtil:https://plus.hutool.cn/apidocs/cn/hutool/core/util/StrUtil.html - Hutool
ObjectUtil:https://plus.hutool.cn/apidocs/cn/hutool/core/util/ObjectUtil.html - Hutool
DateUtil:https://plus.hutool.cn/apidocs/cn/hutool/core/date/DateUtil.html - Hutool
RandomUtil:https://plus.hutool.cn/apidocs/cn/hutool/core/util/RandomUtil.html - Hutool
IdUtil:https://plus.hutool.cn/apidocs/cn/hutool/core/util/IdUtil.html - Hutool
BeanUtil:https://plus.hutool.cn/apidocs/cn/hutool/core/bean/BeanUtil.html - Hutool
SpringUtil:https://plus.hutool.cn/apidocs/cn/hutool/extra/spring/SpringUtil.html - Hutool
CollStreamUtil:https://plus.hutool.cn/apidocs/cn/hutool/core/stream/CollStreamUtil.html - Hutool
MapUtil:https://plus.hutool.cn/apidocs/cn/hutool/core/map/MapUtil.html - Hutool
Convert:https://plus.hutool.cn/apidocs/cn/hutool/core/convert/Convert.html - JDK
ChronoUnit:https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/time/temporal/ChronoUnit.html