hutool

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 版本为准。

官方参考

相关推荐
H_oRIZoN_1 小时前
Linux入门DAY27(文件IO(系统调用)详解|open/read/write/lseek)
java·linux·服务器
延凡科技1 小时前
从 “人管机器“ 到 “数据管人“:智慧矿山综合管控落地实践
java·后端·struts
一木 之林2 小时前
四、STL容器与数据结构
开发语言·数据结构·c++
QX_hao2 小时前
【Go】--Cobra-cli的用法
开发语言·后端·golang
卓怡学长2 小时前
w180springboot基于Java的悠扬乐器管理
java·spring boot·mysql·spring·maven·intellij-idea
艾醒(AiXing-w)2 小时前
LangChain 1.0 入门(三):稳定性双核心——重试机制+速率限速器参数详解与实战
开发语言·langchain·php
古法安卓2 小时前
Android-高版本 LMKD 源码解析:基于 PSI 的内存压力监控与查杀全流程
android·java·android studio
古法安卓2 小时前
Android-PSI 详解:libpsi 源码解析——116 行代码架起 lmkd 与内核之间的桥
android·java·android studio
用户36533043470942 小时前
深入理解 Java Unsafe:从底层魔法到被淘汰的命运
java