通用枚举迭代器java

时间:2017-10-11 11:27:54

标签: java generics enums java-8

我的枚举

public enum ExamStausEnum {

    RESULTAWAITED("Result Awaiting"), 
    PASSED("Passed"), 
    FAILED("Failed");

    private String value;

    ExamStausEnum(String value) {
        this.value = value;
    }

    @JsonValue
    public String getValue() {
        return value;
    }
}

Generic Iterator Enum

static <E extends Enum <E>> void foo(Class<E> elemType) {
    for (E e : java.util.EnumSet.allOf(elemType)) {
        System.out.println(e);
    }
}

结果:

RESULTAWAITED
PASSED
FAILED

如何打印构造函数值?

Result Awaiting
Passed
Failed

2 个答案:

答案 0 :(得分:6)

添加另一个参数以获得getValue()调用的抽象是不可避免的:

static <E extends Enum <E>> void foo(Class<E> elemType, Function<? super E, ?> f) {
    for(E e : java.util.EnumSet.allOf(elemType)) {
        System.out.println(f.apply(e));
    }
}

然后,您可以调用不一定具有该方法的任意enum类型,例如

foo(Thread.State.class, Object::toString);

或具有以下方法的特定enum

foo(ExamStausEnum.class, ExamStausEnum::getValue);

更多用例是可能的:

foo(Thread.State.class, Enum::name);

foo(ExamStausEnum.class, Enum::ordinal);

当然,您也可以让ExamStausEnum类型覆盖toString()方法,从而无需foo调用getValue()方法。

答案 1 :(得分:1)

更为前沿的方法是创建一个接口,声明所有枚举实现的getValue()方法。

interface EnumWithValue{
   @JsonValue
   String getValue();
}

public enum ExamStausEnum implements EnumWithValue {

    RESULTAWAITED("Result Awaiting"), 
    PASSED("Passed"), 
    FAILED("Failed");

    private String value;

    ExamStausEnum(String value) {
        this.value = value;
    }

    @Override
    public String getValue() {
        return value;
    }
}

然后你可以在foo中投射你的枚举:

static <E extends Enum <E>> void foo(Class<E> elemType) {
    for (E e : java.util.EnumSet.allOf(elemType)) {
        System.out.println(((EnumWithValue)e).getValue());
    }
}