通用枚举迭代器java

Sha*_*oor 0 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

通用迭代器枚举

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

结果:

RESULTAWAITED
PASSED
FAILED
Run Code Online (Sandbox Code Playgroud)

如何打印构造函数值?

Result Awaiting
Passed
Failed
Run Code Online (Sandbox Code Playgroud)

Hol*_*ger 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

foo(Thread.State.class, Object::toString);
Run Code Online (Sandbox Code Playgroud)

或者您的具体enum方法:

foo(ExamStausEnum.class, ExamStausEnum::getValue);
Run Code Online (Sandbox Code Playgroud)

更多用例是可能的:

foo(Thread.State.class, Enum::name);
Run Code Online (Sandbox Code Playgroud)

要么

foo(ExamStausEnum.class, Enum::ordinal);
Run Code Online (Sandbox Code Playgroud)

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