欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > Java 枚举类工具获取数据

Java 枚举类工具获取数据

2025/2/25 1:23:13 来源:https://blog.csdn.net/feyehong/article/details/144173602  浏览:    关键词:Java 枚举类工具获取数据

目录

  • 一. 遇到的问题
  • 二. 解决策
    • 2.1 定义让枚举类继承的接口
    • 2.2 枚举类实现接口
    • 2.3 获取枚举类各种数据的工具类
  • 三. 效果


一. 遇到的问题

⏹项目中有可能需要根据code或者name来获取对应的枚举类,这时枚举类中往往需要添加fromCodefromName这样的代码来进行处理。
如果项目中有多个枚举类的话,这样的通篇一律的代码就会增多,代码就会冗余。

public enum SexTypes {男性("1"),女性("2"),保密("3");private String code;SexTypes(String code) {this.code = code;}public String getCode() {return code;}// 根据code获取枚举类public static SexTypes fromCode(String code) {return Arrays.stream(SexTypes.values()).filter(item -> item.code.equals(code)).findAny().orElse(null);}// 根据name获取枚举类public static SexTypes fromName(String name) {return Arrays.stream(SexTypes.values()).filter(item -> item.name().equals(name)).findAny().orElse(null);}
}

二. 解决策

2.1 定义让枚举类继承的接口

  • 枚举类中的code类型不确定,所以使用泛型更具有通用性
  • name的类型一般就是字符串类型了
public interface IEnumNameValue<T> {T getCode();String getName();
}

2.2 枚举类实现接口

  • 枚举类实现接口,指定code的数据类型
public enum GenderEnum implements IEnumNameValue<Integer> {MALE(1, "男"),FEMALE(0, "女");// 性别值private final Integer code;// 性别名private final String name;GenderEnum(Integer code, String name) {this.code = code;this.name = name;}@Overridepublic Integer getCode() {return code;}@Overridepublic String getName() {return name;}
}

2.3 获取枚举类各种数据的工具类

  • 工具类只能处理实现了IEnumNameValue自定义接口的枚举类
  • 可以根据code和name来获取对应的枚举类
  • 可以根据判断code对应的枚举类是否存在
  • 可以获取code和name的List
  • 可以获取code和name的Map
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;@SuppressWarnings("unchecked")
public final class EnumUtils {public enum CHECK{NG,OK}// 根据code获取枚举对象public static <E extends Enum<? extends IEnumNameValue<V>>, V> E getEnumByCode(E[] enums, V code) {return Arrays.stream(enums).filter(e -> ((IEnumNameValue<V>)e).getCode().equals(code)).findAny().orElse(null);}public static <E extends Enum<? extends IEnumNameValue<V>>, V> E getEnumByCode(Class<E> enumClass, V code) {return EnumUtils.getEnumByCode(enumClass.getEnumConstants(), code);}// 根据名称获取枚举类对象public static <E extends Enum<? extends IEnumNameValue<V>>, V> E getEnumByName(E[] enums, String name) {return Arrays.stream(enums).filter(e -> ((IEnumNameValue<V>)e).getName().equals(name)).findAny().orElse(null);}public static <E extends Enum<? extends IEnumNameValue<V>>, V> E getEnumByName(Class<E> enumClass, String name) {return EnumUtils.getEnumByName(enumClass.getEnumConstants(), name);}// 获取值数组public static <E extends Enum<? extends IEnumNameValue<V>>, V> List<V> getCodeList(Class<E> enumClass) {return Arrays.stream(enumClass.getEnumConstants()).map(e -> ((IEnumNameValue<V>) e).getCode()).collect(Collectors.toList());}// 获取名称数组public static <E extends Enum<? extends IEnumNameValue<V>>, V> List<String> getNameList(Class<E> enumClass) {return Arrays.stream(enumClass.getEnumConstants()).map(e -> ((IEnumNameValue<V>) e).getName()).collect(Collectors.toList());}// 获取值 -> 名称 的 Mappublic static <E extends Enum<? extends IEnumNameValue<V>>, V> Map<V, String> getCodeNameMap(Class<E> enumClass) {return Arrays.stream(enumClass.getEnumConstants()).collect(Collectors.toMap(e -> ((IEnumNameValue<V>) e).getCode(),e -> ((IEnumNameValue<V>) e).getName()));}// 获取名称 -> 值 的 Mappublic static <E extends Enum<? extends IEnumNameValue<V>>, V> Map<String, V> getNameCodeMap(Class<E> enumClass) {return Arrays.stream(enumClass.getEnumConstants()).collect(Collectors.toMap(e -> ((IEnumNameValue<V>) e).getName(),e -> ((IEnumNameValue<V>) e).getCode()));}// 校验code所对应的枚举值知否存在public static <E extends Enum<? extends IEnumNameValue<V>>, V> CHECK isExist(Class<E> enumClass, V code) {for (E e : enumClass.getEnumConstants()) {if (((IEnumNameValue<V>) e).getCode().equals(code)) {return CHECK.OK;}}return CHECK.NG;}
}

三. 效果

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词