根据枚举创建枚举类别

时间:2017-04-11 18:33:58

标签: java enums java-8 java-stream

我有多个状态存储在枚举中。

public enum Status {
    IS_A("isA"),
    IS_B("isB"),
    FP_ERR("fp_err"),
    FP_BLAH("fp_blah"),
    CORRECT("correct")

    private final String value;

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

我想基于这些状态创建类别,而不是通过以下方式修改Status enum类。

public enum Category {
    CategoryA("CategoryA",Status.IS_A, Status.IS_B),
    CategoryB("CategoryB",Status.FP_ERR, Status.FP_BLAH).
    CategoryC("CategoryC",Status.Correct);

    private List<Status> status;
    private String category;

    private static final Map<Status, String> VALUE_MAP = Stream.of(Category.values()) 

    Category(String category, Status ... status) {
        this.status = Arrays.asList(status);
        this.category = category;
    }

    public static String getCategory(Status status) {
        //Retrun category based on Status type
        String category = VALUE_MAP.get(status);
        return category;
    }
}

我无法弄清楚如何将每个类别的值及其状态存储在地图VALUE_MAP

2 个答案:

答案 0 :(得分:2)

您根本不需要VALUE_MAP。在category之后检索Status时,您只需浏览所有Category.values()并找到包含所请求的Status的<{1}}:

public static String getCategory(Status status) {
    for (Category category : values()) {
        if (category.status.contains(status)) {
            return category.category;
        }
    }
    return null;
}

答案 1 :(得分:2)

如果您将初始化更改为static块,则可以执行以下操作:

private static final EnumMap<Status, String> VALUE_MAP = new EnumMap<>(Status.class);
static {
    Arrays.stream(Category.values()).forEach(category -> {
        category.status.forEach(status -> {
            VALUE_MAP.put(status, category.category);
        });
    });
}