utils-toolkit

SKILL.md

后端工具类大全

快速索引

功能 推荐方案 备选方案 常用方法
对象转换 [你的对象转换工具] MapStruct / BeanUtils / ModelMapper convert() / copyProperties()
字符串 Hutool StrUtil Apache Commons StringUtils / Guava Strings isBlank(), format()
集合/流 Hutool CollUtil + Java Stream Guava Collections2 isEmpty(), filter(), toList()
树结构 Hutool TreeUtil 自定义递归构建 build()
日期时间 java.time API Hutool DateUtil LocalDateTime.now(), format()
参数校验 Jakarta Validation Hutool Validator @NotNull, @NotBlank
JSON Jackson ObjectMapper Gson / Hutool JSONUtil toJsonString(), parseObject()
业务异常 [你的异常类] 自定义 RuntimeException throw new [YourException]()
登录用户 [你的用户上下文工具] SecurityContextHolder / 自定义 ThreadLocal getUserId(), getUsername()
Spring容器 ApplicationContext 自定义 SpringUtils getBean()

1. 对象转换

选型对比

方案 性能 易用性 特点
MapStruct 极高(编译期生成) 中(需定义接口) 类型安全、零反射
Hutool BeanUtil 中(反射) 高(一行调用) 简单场景首选
Spring BeanUtils 中(反射) Spring 内置,无额外依赖
ModelMapper 高(约定优于配置) 深度映射、复杂场景

通用用法

// 方案 A: Hutool BeanUtil(简单场景推荐)
import cn.hutool.core.bean.BeanUtil;

XxxVo vo = BeanUtil.copyProperties(entity, XxxVo.class);
List<XxxVo> voList = BeanUtil.copyToList(entityList, XxxVo.class);

// 方案 B: MapStruct(高性能场景推荐)
// 1. 定义 Mapper 接口
@Mapper(componentModel = "spring")
public interface XxxConverter {
    XxxVo toVo(XxxEntity entity);
    List<XxxVo> toVoList(List<XxxEntity> entities);
}

// 2. 注入使用
@Resource
private XxxConverter xxxConverter;
XxxVo vo = xxxConverter.toVo(entity);

2. 字符串操作

Hutool StrUtil

import cn.hutool.core.util.StrUtil;

// 判空
StrUtil.isBlank(str);       // null / "" / " " -> true
StrUtil.isNotBlank(str);

// 格式化(占位符 {})
StrUtil.format("用户 {} 不存在", userId);

// 分割/拼接
List<String> list = StrUtil.split("1,2,3", ',');
String joined = String.join(",", list);

Apache Commons StringUtils

import org.apache.commons.lang3.StringUtils;

StringUtils.isBlank(str);
StringUtils.substringBefore(str, "-");
StringUtils.leftPad("5", 3, '0');   // "005"

Guava Strings

import com.google.common.base.Strings;

Strings.isNullOrEmpty(str);
Strings.padStart("5", 3, '0');   // "005"

3. 集合与流操作

Hutool CollUtil

import cn.hutool.core.collection.CollUtil;

CollUtil.isEmpty(list);       // null 或空 -> true
CollUtil.isNotEmpty(list);

Java Stream API

// 过滤
List<User> active = users.stream()
    .filter(u -> "1".equals(u.getStatus()))
    .toList();

// 提取属性
List<Long> ids = users.stream()
    .map(User::getId)
    .toList();

Set<Long> deptIds = users.stream()
    .map(User::getDeptId)
    .collect(Collectors.toSet());

// 转 Map
Map<Long, User> userMap = users.stream()
    .collect(Collectors.toMap(User::getId, Function.identity()));

Map<Long, String> nameMap = users.stream()
    .collect(Collectors.toMap(User::getId, User::getName));

// 分组
Map<Long, List<User>> grouped = users.stream()
    .collect(Collectors.groupingBy(User::getDeptId));

// 拼接字符串
String names = users.stream()
    .map(User::getName)
    .collect(Collectors.joining(","));

4. 树结构构建

Hutool TreeUtil

import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.core.lang.tree.TreeNodeConfig;

List<Tree<Long>> tree = TreeUtil.build(list, 0L, (item, treeNode) -> {
    treeNode.setId(item.getId());
    treeNode.setParentId(item.getParentId());
    treeNode.setName(item.getName());
    treeNode.setWeight(item.getOrderNum());
    treeNode.putExtra("icon", item.getIcon());
});

自定义递归构建

public List<TreeNode> buildTree(List<TreeNode> nodes, Long parentId) {
    return nodes.stream()
        .filter(n -> Objects.equals(n.getParentId(), parentId))
        .peek(n -> n.setChildren(buildTree(nodes, n.getId())))
        .sorted(Comparator.comparingInt(TreeNode::getSort))
        .toList();
}

5. 日期时间 - java.time API

import java.time.LocalDateTime;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.Duration;
import java.time.temporal.ChronoUnit;

// 获取当前时间
LocalDateTime now = LocalDateTime.now();
LocalDate today = LocalDate.now();

// 格式化
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = now.format(fmt);

// 解析
LocalDateTime parsed = LocalDateTime.parse("2026-01-24 15:30:00", fmt);

// 时间差
long days = ChronoUnit.DAYS.between(start, end);
Duration duration = Duration.between(start, end);
long hours = duration.toHours();

// 日期加减
LocalDateTime tomorrow = now.plusDays(1);
LocalDateTime lastMonth = now.minusMonths(1);

Hutool DateUtil(兼容旧 Date 类型)

import cn.hutool.core.date.DateUtil;

// 自动识别多种格式
Date date = DateUtil.parse("2026-01-24 15:30:00");
String formatted = DateUtil.formatDateTime(date);

// 时间差
long between = DateUtil.between(start, end, DateUnit.DAY);

6. 参数校验

Jakarta Validation(JDK 17+ 推荐)

import jakarta.validation.constraints.*;

public class XxxDTO {
    @NotNull(message = "ID不能为空", groups = {UpdateGroup.class})
    private Long id;

    @NotBlank(message = "名称不能为空", groups = {InsertGroup.class, UpdateGroup.class})
    @Size(max = 100, message = "名称长度不能超过100个字符")
    private String name;

    @Min(value = 0, message = "数量不能为负数")
    private Integer quantity;
}

Controller 层使用

@PostMapping("/add")
public void add(@Validated(InsertGroup.class) @RequestBody XxxDTO dto) { }

@PutMapping("/update")
public void edit(@Validated(UpdateGroup.class) @RequestBody XxxDTO dto) { }

7. JSON 操作

Jackson(Spring Boot 默认)

import com.fasterxml.jackson.databind.ObjectMapper;

// 推荐封装为项目统一的 JsonUtils
public class JsonUtils {
    private static final ObjectMapper MAPPER = new ObjectMapper();

    public static String toJsonString(Object obj) {
        return MAPPER.writeValueAsString(obj);
    }

    public static <T> T parseObject(String json, Class<T> clazz) {
        return MAPPER.readValue(json, clazz);
    }

    public static <T> List<T> parseArray(String json, Class<T> clazz) {
        return MAPPER.readValue(json,
            MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
    }
}

Hutool JSONUtil

import cn.hutool.json.JSONUtil;

String json = JSONUtil.toJsonStr(obj);
User user = JSONUtil.toBean(json, User.class);

8. 对象判空

import cn.hutool.core.util.ObjectUtil;

ObjectUtil.isNull(obj);       // null -> true
ObjectUtil.isNotNull(obj);
ObjectUtil.defaultIfNull(obj, defaultValue);

工具类选择速查

需求 推荐工具 说明
BO/Entity/VO 转换 [你的对象转换工具] 项目统一选型
字符串判空 StrUtil.isBlank() Hutool
集合判空 CollUtil.isEmpty() Hutool
对象判空 ObjectUtil.isNull() Hutool
提取集合属性 Stream.map().toList() Java Stream
集合转 Map Collectors.toMap() Java Stream
构建树 TreeUtil.build() Hutool
日期格式化 LocalDateTime.format() java.time
抛业务异常 throw new [你的异常类]() 项目自定义
获取登录用户 [你的用户上下文工具] 项目自定义
Excel 导出 EasyExcel / Apache POI 按需选型
生成 ID IdUtil.getSnowflakeNextId() Hutool

禁止事项

// ❌ 禁止使用 Map 传递业务数据
public Map<String, Object> getXxx() { ... }
// ✅ 正确:使用 VO/DTO
public XxxVO getXxx() { ... }

// ❌ 禁止频繁创建 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
// ✅ 正确:使用单例或项目统一封装的 JsonUtils

// ❌ 禁止混用多种对象转换工具
// ✅ 正确:项目统一选型,保持一致
Weekly Installs
5
GitHub Stars
9
First Seen
9 days ago
Installed on
gemini-cli5
github-copilot5
codex5
kimi-cli5
cursor5
amp5