通过枚举获取对应值

public enum WeChatReasonEnum {
 
    ACCOUNT_FROZEN("ACCOUNT_FROZEN","账户冻结"),
    REAL_NAME_CHECK_FAIL("REAL_NAME_CHECK_FAIL","用户未实名"),
    NAME_NOT_CORRECT("NAME_NOT_CORRECT","用户姓名校验失败"),
    OPENID_INVALID("OPENID_INVALID","Openid校验失败"),
    TRANSFER_QUOTA_EXCEED("TRANSFER_QUOTA_EXCEED","超过用户单笔收款额度"),
    DAY_RECEIVED_QUOTA_EXCEED("DAY_RECEIVED_QUOTA_EXCEED","超过用户单日收款额度"),
    MONTH_RECEIVED_QUOTA_EXCEED("MONTH_RECEIVED_QUOTA_EXCEED","超过用户单月收款额度"),
    DAY_RECEIVED_COUNT_EXCEED("DAY_RECEIVED_COUNT_EXCEED","超过用户单日收款次数"),
    PRODUCT_AUTH_CHECK_FAIL("PRODUCT_AUTH_CHECK_FAIL","产品权限校验失败"),
    OVERDUE_CLOSE("OVERDUE_CLOSE","转账关闭"),
    ID_CARD_NOT_CORRECT("ID_CARD_NOT_CORRECT","用户身份证校验失败"),
    ACCOUNT_NOT_EXIST("ACCOUNT_NOT_EXIST","用户账户不存在"),
    TRANSFER_RISK("TRANSFER_RISK","转账存在风险"),
    REALNAME_ACCOUNT_RECEIVED_QUOTA_EXCEED("REALNAME_ACCOUNT_RECEIVED_QUOTA_EXCEED","用户账户收款受限,请引导用户在微信支付查看详情"),
    RECEIVE_ACCOUNT_NOT_PERMMIT("RECEIVE_ACCOUNT_NOT_PERMMIT","未配置该用户为转账收款人"),
    PAYER_ACCOUNT_ABNORMAL("PAYER_ACCOUNT_ABNORMAL","商户账户付款受限,可前往商户平台-违约记录获取解除功能限制指引"),
    PAYEE_ACCOUNT_ABNORMAL("PAYEE_ACCOUNT_ABNORMAL","用户账户收款异常,请引导用户完善其在微信支付的身份信息以继续收款"),
    TRANSFER_REMARK_SET_FAIL("TRANSFER_REMARK_SET_FAIL","转账备注设置失败,请调整对应文案后重新再试");
 
 
    private String type;
    private String value;
 
     WeChatReasonEnum(String type , String value) {
        this.type = type;
        this.value = value;
    }
 
 
    public static String getValueByType(String  type){
        Optional<WeChatReasonEnum> m1 =  EnumUtil.getEnumObject(WeChatReasonEnum.class, e -> e.getType().equals(type));
        return m1.isPresent() ? m1.get().getValue() : null;
    }
 
    public String getType() {
        return type;
    }
 
    public void setType(String type) {
        this.type = type;
    }
 
    public String getValue() {
        return value;
    }
 
    public void setValue(String value) {
        this.value = value;
    }
}

枚举工具类

public class EnumUtil {
 
        private static Map<Class, Object> map = new ConcurrentHashMap<>();
 
        /**
         * 根据条件获取枚举对象
         *
         * @param className 枚举类
         * @param predicate 筛选条件
         * @param <T>
         * @return
         */
        public static <T> Optional<T> getEnumObject(Class<T> className, Predicate<T> predicate) {
            if (!className.isEnum()) {
                return null;
            }
            Object obj = map.get(className);
            T[] ts = null;
            if (obj == null) {
                ts = className.getEnumConstants();
                map.put(className, ts);
            } else {
                ts = (T[]) obj;
            }
            return Arrays.stream(ts).filter(predicate).findAny();
        }
 
 
}
<think>嗯,用户的问题是关于如何在Java中根据枚举获取对应枚举名称。我需要先仔细理解他的需求。他可能有一个枚举类型,里面有不同的枚举常量,每个常量可能有对应,比如数字或者字符串,他想通过这个来找到对应枚举常量的名称。 首先,我需要回想一下Java枚举的基本知识。枚举Java中是一种特殊的类,每个枚举常量都是该类的实例。通常,枚举可以有字段、构造函数和方法。比如,用户可能定义了一个枚举,每个枚举常量有一个关联的,比如状态码或者数据库中的代码,然后想通过这个获取枚举的名称。 接下来,用户需要的是根据获取名称的方法。常用的方法有哪些呢?我记得可以通过遍历枚举的values()方法,逐个比较,找到匹配的枚举常量,然后调用name()方法或者自定义的获取名称的方法。另外,可能还可以用Java 8的流式API来简化这个过程,或者使用反射,但反射可能比较复杂且不安全,不太推荐。 现在,我需要参考用户提供的引用内容。引用[1]提到使用values()和name()方法,引用[2]也提到了values()方法,引用[3]提到流式编程处理枚举,引用[4]讲的是反射获取枚举参数。所以,用户提供的资料中有几种方法:遍历、流式处理、反射。但反射可能不是最佳实践,应该优先考虑前两种。 然后,我应该考虑如何组织回答。首先,定义一个示例枚举,比如StatusEnum,包含code和name属性,并给出构造函数和getter方法。然后,分步骤说明不同的方法: 1. 基础遍历法:使用values()遍历,比较,返回对应枚举实例,再获取name。 2. 流式处理法:使用Stream和filter,结合findFirst,处理可能的空情况。 3. 反射方法:虽然用户提到反射,但需要指出其风险,不推荐使用。 需要提供示例代码,并确保代码语法正确。例如,在遍历方法中,可能需要处理找不到的情况,返回null或抛出异常。流式处理可以用Optional来处理可能为空的情况。 另外,用户的问题可能涉及到如何定义枚举,如何添加自定义字段,所以示例代码中的枚举定义部分要完整,展示字段和构造方法。 可能还需要注意事项,比如枚举是否唯一,如何处理重复,或者性能考虑,比如使用静态Map来缓存,提高查找效率。但根据用户提供的引用,可能暂时不需要涉及更复杂的优化,保持回答简洁。 最后,生成相关问题,比如如何反向查找,如何优化性能,如何处理重复,或者如何在其他框架中使用枚举转换,比如Spring或MyBatis。 检查是否所有代码都正确,比如流式处理中的orElse(null),确保Optional正确使用。反射部分的代码可能较复杂,需要正确获取方法并调用,但用户引用[4]中的代码示例可能有帮助。 总结步骤:定义枚举,展示三种方法,给出代码示例,注意事项,相关问题。</think>### Java根据枚举获取枚举名称的实现方法 在Java中根据枚举获取对应枚举名称,可通过以下三种方法实现。这里以包含`code`和`name`属性的枚举类型为例进行说明。 #### 1. 基础遍历法 通过遍历枚举的所有并比对目标,最终返回匹配的枚举常量名称。 ```java public enum StatusEnum { SUCCESS(200, "成功"), ERROR(500, "错误"); private final int code; private final String name; StatusEnum(int code, String name) { this.code = code; this.name = name; } public int getCode() { return code; } public String getName() { return name; } public static String getNameByCode(int targetCode) { for (StatusEnum status : StatusEnum.values()) { if (status.getCode() == targetCode) { return status.name(); // 返回枚举常量名称 } } return null; // 未找到时返回null } } // 使用示例 String enumName = StatusEnum.getNameByCode(200); // 返回"SUCCESS" ``` #### 2. 流式编程法(Java 8+) 利用Stream API实现更简洁的查找逻辑: ```java public static String getNameByCode(int targetCode) { return Arrays.stream(StatusEnum.values()) .filter(status -> status.getCode() == targetCode) .findFirst() .map(Enum::name) .orElse(null); // 未找到时返回null } ``` #### 3. 反射方法(不推荐) 通过反射获取枚举属性,适用于动态场景,但存在性能和安全风险: ```java public static String getNameByCodeViaReflection(int targetCode) throws Exception { Class<StatusEnum> enumClass = StatusEnum.class; Method getCodeMethod = enumClass.getMethod("getCode"); for (Object enumConstant : enumClass.getEnumConstants()) { int code = (int) getCodeMethod.invoke(enumConstant); if (code == targetCode) { return ((Enum<?>) enumConstant).name(); } } return null; } ``` #### 注意事项 - **唯一性**:需确保枚举的唯一性,否则可能返回第一个匹配项 - **性能优化**:频繁调用时可使用静态Map缓存,例如: ```java private static final Map<Integer, String> CODE_TO_NAME = Arrays.stream(StatusEnum.values()) .collect(Collectors.toMap(StatusEnum::getCode, StatusEnum::name)); ``` - **空处理**:建议使用`Optional`或抛出明确异常替代返回`null`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值