Получить значение Enum из строки - PullRequest
2 голосов
/ 19 апреля 2020

У меня есть перечислимый класс:

    public enum Severity {

        HIGH("High level it is ", RED, DARK_RED),
        MEDIUM("Medium level it is ", AMBER, LIGHT_YELLOW),
        LOW("Low level it is ", GREEN, DARK_GREEN);

    private String value;

    private List<Colors> color;

    Severity(String value, Color... colors) {
        this.value = value;
        this.color = Arrays.asList(colors);
    }

    public static List<String> getSeverityKeys() {
        return EnumSet.allOf(Severity.class).stream()
            .map(Severity::name)
            .collect(Collectors.toList());
    }

    public static List<String> getSeverityValues() {
        return EnumSet.allOf(Severity.class).stream()
            .map(Severity::getValue)
            .collect(Collectors.toList());
    }

    public static Severity getDescriptionByColor(String color) {

        return EnumSet.allOf(Severity.class).stream()
            .filter(severity -> Severity.getToolDomainValues().equals(color))
            .findFirst()
            .orElse(null);
    }

    public String getValue() {
        return value;
    }

    public List<Color> getColor() {
        return color;
    }
  }

Вход: DARK_RED

Выход: высокий уровень

ИЛИ

Ввод: DARK_GREEN

Выход: низкий уровень

Как этого добиться, используя JAVA Функциональность потока

Я пытаюсь исправить метод - getDescriptionByColor (цвет строки)

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Я предположил, что цвета получены из перечисления Color, вы можете адаптировать


Вам нужно перебрать Severity.values() и найти те, которые имеют значение, которое вы ' ищите, затем получите строку (первый параметр) из найденных:

static String getString(Color value) {
    return Arrays.stream(Severity.values())
            .filter(severity -> severity.getColorB().equals(value))
            .map(Severity::getString)
            .findFirst().orElse(null);
}

Use

System.out.println(Severity.getString(Color.DARK_RED)); //High level it is
System.out.println(Severity.getString(Color.DARK_GREEN)); // Low level it is
0 голосов
/ 19 апреля 2020

Мы также можем использовать EnumSet вместо потока массивов

Используя EnumSet

class TestClass {
    public static void main(String[] args) {
        String value = "DARK_RED";

        Optional<String> res = EnumSet.allOf(Severity.class)
                .stream()
                .filter(severity -> severity.s3.equals(value))
                .map(Severity::getFirstString)
                .findFirst();

        if(res.isPresent()){
            System.out.println(res.get().toString());
        }
    }
}

Используя Поток массивов

class TestClass {
    public static void main(String[] args) {
        String value = "DARK_RED";
        Optional<String> res = Arrays.stream(Severity.values())
                .filter(severity -> severity.s3.equals(value))
                .map(Severity::getFirstString)
                .findFirst();

        if(res.isPresent()){
            System.out.println(res.get().toString());
        }


    }

}

enum Severity {

    HIGH("High level it is ", "RED", "DARK_RED"),
    MEDIUM("Medium level it is ", "AMBER", "LIGHT_YELLOW"),
    LOW("Low level it is ", "GREEN", "DARK_GREEN");

    String s1;
    String s2;
    String s3;

    Severity(String s1, String s2, String s3){
        this.s1 = s1;
        this.s2 = s2;
        this.s3 = s3;
    }

    public String getFirstString(){
        return this.s1;
    }

}
...