枚举工具类

简介: 枚举工具类

暮冬时烤雪,迟夏写长信。——陈鸿宇

现已并入hutool5.8.0,PR链接地址:https://gitee.com/dromara/hutool/pulls/583

This is a story about pull request

getFieldBy

我们在使用枚举的过程中,经常会遇到字段相互之间映射的场景:

例如此处我编写一个GenderEnum

@Getter
@AllArgsConstructor
public enum GenderEnum {
               /**
   * 性别枚举
   */
  FEMALE("男"),
  MALE("女"),
  UNKNOWN("未知");
  private final String desc;
}

然后对其进行使用,我们前端传入可能是0/1/2这样的数字,我们就可以通过EnumUtil#getFieldBy,来通过ordinal,也就是我们枚举的序号,获取对应的汉字返回

//                                            获取desc          通过ordinal 值为0
String desc = EnumUtil.getFieldBy(GenderEnum::getDesc, GenderEnum::ordinal, 0);
Assert.assertEquals("男", desc);

有木有体会到声明式编程的好处?就像我们写sql一样,很流利顺畅的就写出来了这样优雅的代码

如果还有小伙伴不熟悉lambda,赶紧戳这里来学习!开启声明式编程的时代!

getBy

这时候有朋友就要问了,阿超那你这个EnumUtil.getBy不是多余的吗?容我娓娓道来

我们如果遇到了这种场景:

需要根据枚举对应值执行不同的逻辑:此处用一个switch case举个栗子:

(jdk8开始允许枚举作为switch case的条件)

GenderEnum genderEnum = EnumUtil.getBy(GenderEnum::ordinal, RandomUtil.randomInt(0, 3));
if (genderEnum == null) {
  return;
}
switch (genderEnum) {
  case FEMALE:
  Console.log("这是一位帅帅的小哥哥");
    break;
  case MALE:
    Console.log("这是一位美美的小姐姐");
    break;
  case UNKNOWN:
    Console.log("这位更是重量级,Ta不愿意透露性别");
    break;
  default:
    break;
}

让我们一起减少遍布在项目各处的魔法值吧! ✌️

大家用枚举去管理,也能方便统一修改和厘清逻辑

MapUtil#change

这里简单介绍一个基本使用和一个复杂场景:

// Add test like a foreigner
Map<Integer, String> adjectivesMap = MapUtil.<Integer, String>builder()
    .put(0, "lovely")
    .put(1, "friendly")
    .put(2, "happily")
    .build();
Map<Integer, String> resultMap = MapUtil.change(adjectivesMap, (k, v) -> v + " " + PeopleEnum.values()[k].name().toLowerCase());
Assert.assertEquals("lovely girl", resultMap.get(0));
Assert.assertEquals("friendly boy", resultMap.get(1));
Assert.assertEquals("happily child", resultMap.get(2));

复杂场景:

             // 下单用户,Queue表示正在 .排队. 抢我抢不到的二次元周边!
Queue<String> customers = new ArrayDeque<>(Arrays.asList("刑部尚书手工耿", "木瓜大盗大漠叔", "竹鼠发烧找华农", "朴实无华朱一旦"));
// 分组
List<Group> groups = Stream.iterate(0L, i -> ++i).limit(4).map(i -> Group.builder().id(i).build()).collect(Collectors.toList());
// 如你所见,它是一个map,key由用户id,value由用户组成
Map<Long, User> idUserMap = Stream.iterate(0L, i -> ++i).limit(4).map(i -> User.builder().id(i).name(customers.poll()).build()).collect(Collectors.toMap(User::getId, Function.identity()));
// 如你所见,它是一个map,key由分组id,value由用户ids组成,典型的多对多关系
Map<Long, List<Long>> groupIdUserIdsMap = groups.stream().flatMap(group -> idUserMap.keySet().stream().map(userId -> UserGroup.builder().groupId(group.getId()).userId(userId).build())).collect(Collectors.groupingBy(UserGroup::getUserId, Collectors.mapping(UserGroup::getGroupId, Collectors.toList())));
// 神奇的魔法发生了, 分组id和用户ids组成的map,竟然变成了订单编号和用户实体集合组成的map
Map<Long, List<User>> groupIdUserMap = MapUtil.change(groupIdUserIdsMap, (groupId, userIds) -> userIds.stream().map(idUserMap::get).collect(Collectors.toList()));
// 然后你就可以拿着这个map,去封装groups,使其能够在订单数据带出客户信息啦
groups.forEach(group -> Opt.ofNullable(group.getId()).map(groupIdUserMap::get).ifPresent(group::setUsers));
// 下面是测试报告
groups.forEach(group -> {
  List<User> users = group.getUsers();
  Assert.assertEquals("刑部尚书手工耿", users.get(0).getName());
  Assert.assertEquals("木瓜大盗大漠叔", users.get(1).getName());
  Assert.assertEquals("竹鼠发烧找华农", users.get(2).getName());
  Assert.assertEquals("朴实无华朱一旦", users.get(3).getName());
});
// 能写代码真开心

用到的一些自定义的类

enum PeopleEnum {GIRL, BOY, CHILD}
@Data
@Builder
public static class User {
  private Long id;
  private String name;
}
@Data
@Builder
public static class Group {
  private Long id;
  private List<User> users;
}
@Data
@Builder
public static class UserGroup {
  private Long userId;
  private Long groupId;
}
相关文章
|
机器学习/深度学习 人工智能 算法
AIGC革新商业模式与用户体验
【1月更文挑战第19天】AIGC革新商业模式与用户体验
438 1
AIGC革新商业模式与用户体验
|
存储 Java 数据库连接
MyBatis-Plus 基础操作指南:实现高效的增删改查
MyBatis-Plus 基础操作指南:实现高效的增删改查
806 0
|
前端开发 Java Spring
SpringBoot2.6.x 整合swagger3.0 报错Failed to start bean ‘documentationPluginsBootstrapper‘
org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
15903 3
SpringBoot2.6.x 整合swagger3.0 报错Failed to start bean ‘documentationPluginsBootstrapper‘
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
525 1
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
8月前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【注意力机制篇】| ICLR2023 高效计算与全局局部信息融合的 Sea_Attention 模块(含C2PSA二次创新)
YOLOv11改进策略【注意力机制篇】| ICLR2023 高效计算与全局局部信息融合的 Sea_Attention 模块(含C2PSA二次创新)
466 2
YOLOv11改进策略【注意力机制篇】| ICLR2023 高效计算与全局局部信息融合的 Sea_Attention 模块(含C2PSA二次创新)
|
12月前
|
数据采集 测试技术 Swift
666条数据,训练LongWriter模型,写万字长文!模型&数据集均开源!
大模型的上下文(Context)支持越来越长的背景下,让通用的大模型遵循指令来保障长文本输出的长度,依然是一个挑战。
|
存储 Java 编译器
JNI内存方面说明以及相关类型手动释放内存
JNI内存方面说明以及相关类型手动释放内存
1341 0
|
人工智能 安全 人机交互
未来智能家居系统的发展趋势与挑战
随着人工智能和物联网技术的飞速发展,智能家居系统正日益成为现代家庭生活中不可或缺的一部分。本文将探讨未来智能家居系统的发展趋势与挑战,包括人机交互、数据安全、生态整合等方面的发展现状和前景。
428 1
|
存储 供应链 安全
【区块链】联盟链
【区块链】联盟链
794 0