根據值獲取枚舉類對象工具類EnumUtils


枚舉類

public enum Sex {

    man("M","男"),woman("W","女");
    private String myCode;
    private String value;
    
    private Sex(String myCode, String value) {
        this.myCode = myCode;
        this.value = value;
    }
    public String getMyCode() {
        return myCode;
    }
    public void setMyCode(String myCode) {
        this.myCode = myCode;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    
}

公共工具類

/**
 * https://blog.csdn.net/u010125873/article/details/81386320
 * @author admin
 */
public class EnumUtils {

    private static Map<Class,Object> map = new ConcurrentHashMap<>();
    
    /**
     * 根據條件獲取枚舉對象
     * @param className 枚舉類
     * @param predicate 篩選條件
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> Optional<T> getEnumObject(Class<T> className, Predicate<T> predicate) {
        if(!className.isEnum()){
//            logger.info("Class 不是枚舉類");
            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();
    }

    public static void main(String[] args) {
        
        Optional<Sex> m = EnumUtils.getEnumObject(Sex.class, e -> e.getMyCode().equals("W"));
        System.out.println(m.isPresent() ? m.get().getValue():null);
    }
}

特點:

1)能自動獲取枚舉類中的方法,如e.getMyCode()和m.get().getValue()

參考:https://blog.csdn.net/u010125873/article/details/81386320

 

另外一種通過反射實現:

public class EnumHelperUtil{
    /**
     * 使用枚舉類型對應的typeName獲取枚舉類型
     * @param clazz   枚舉類的class 
     * @param getTypeNameMethodName  傳入的typeName的get方法
     * @param typeName 傳入的typeName值,這個方法為Object類型
     */
    public static <T extends Enum<T>> T getEnumsValue(Class<T> clazz,String getTypeNameMethodName, Object typeName){
        T result = null;
        try{
            T[] arr = clazz.getEnumConstants();
            Method targetMethod = clazz.getDeclaredMethod(getTypeNameMethodName);
            Object typeNameVal = null;
            for(T entity:arr){
                typeNameVal = targetMethod.invoke(entity);
                if(typeNameVal.equals(typeName)){
                    result = entity;
                    break;
                }
            }            
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }
        return result;
    }
    
    public static void main(String[] args) {
        Sex byStringTypeName = EnumHelperUtil.getEnumsValue(Sex.class, "getMyCode", 1);
        System.out.println(byStringTypeName.getValue());
    }
}

鏈接:https://blog.csdn.net/busbanana/article/details/72954676

注意:原文中提供了Integer和String的2種方法,而本例統一轉為Object,只提供一個方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM