Java Enum, чтобы найти значения givng null - PullRequest
0 голосов
/ 28 марта 2019

У меня есть следующий код: я хочу получить значение Approved, когда я передаю A, и если я передал R, тогда я должен получить Reject New, но он не работает и дает мне нулевое значение.

public enum MyEnum {
    A("Approved"),
    R("Reject New"),

    private String status;

    private MyEnum(String status) {
        this.status = status;
    }

    public String getStatus() {
        return status;
    }

    public static MyEnum fromString(String text) {
        return Arrays.stream(values())
          .filter(v -> v.status.equalsIgnoreCase(text))
          .findFirst()
          .orElse(null);
    }
}

Другой код:

public class Demo {
    public static void main(String[] args) {
        System.out.println(MyEnum.fromString("A"));
    }
}

Ответы [ 4 ]

4 голосов
/ 28 марта 2019

Вы сравниваете не ту строку.Это должно быть

 System.out.println(MyEnum.fromString("Approved"));

. Для получения перечисления вы можете использовать valueOf

System.out.println(MyEnum.valueOf("A").getStatus()); // prints Approved
1 голос
/ 28 марта 2019

Не используйте valueOf() напрямую.Это с учетом регистра и выдает ошибку, когда не находит соответствующий enum.

Вам нужно искать поле name , а не поле status :

public static MyEnum fromString(String text) {
        return Arrays.stream(values())
          .filter(v -> v.name().equalsIgnoreCase(text))
          .findFirst()
          .orElse(null);
    }
}

И как только вы получите enum, вызовите метод getStatus() для возвратаApproved:

    MyEnum foundEnum = MyEnum.fromString("A");
    System.out.println(foundEnum != null ? foundEnum.getStatus() : "- Not found -");

Или используйте Optional подход:

public static Optional<MyEnum> fromStringOptional(String text) {
    try {
        return Optional.of(MyEnum.valueOf(text));
    } catch (IllegalArgumentException|NullPointerException e) {
        return Optional.empty();
    }
}

И сделайте

Optional<MyEnum> foundEnum3 = MyEnum.fromStringOptional(searchString);
System.out.println(foundEnum3.map(a -> a.getStatus()).orElse("- Not found -"));
System.out.println(foundEnum3.isPresent() ? foundEnum3.getStatus() : "- Not found -");

Полный пример:

import java.util.Arrays;
import java.util.Optional;

public class EnumDemo {

    public enum MyEnum {
        A("Approved"),
        R("Reject New");

        private String status;

        private MyEnum(String status) {
            this.status = status;
        }

        public String getStatus() {
            return status;
        }

        public static MyEnum getEnumfromString(String text) {
            return Arrays.stream(values())
              .filter(v -> v.name().equalsIgnoreCase(text))
              .findFirst()
              .orElse(null);
        }

        public static String getStatusfromString(String text) {
            MyEnum found = Arrays.stream(values())
                  .filter(v -> v.name().equalsIgnoreCase(text))
                  .findFirst()
                  .orElse(null);
            return found != null ? found.getStatus() : "- Not found -";
        }

        public static Optional<MyEnum> getOptionalfromString(String text) {
            try {
                return Optional.of(MyEnum.valueOf(text));
            } catch (IllegalArgumentException|NullPointerException e) {
                return Optional.empty();
            }
        }
    }

    public static void doCalls(String searchString) {
        System.out.print("Call 1: ");
        MyEnum foundEnum = MyEnum.getEnumfromString(searchString);
        System.out.println(foundEnum != null ? foundEnum.getStatus() : "- Not found -");

        System.out.print("Call 2: ");
        System.out.println(MyEnum.getStatusfromString(searchString));

        System.out.println("Call 3 :");
        System.out.print(" A: ");
        Optional<MyEnum> foundOptional = MyEnum.getOptionalfromString(searchString);
        System.out.println(foundOptional.map(a -> a.getStatus()).orElse("- Not found -"));
        //or this, which only prints if the enum was found
        System.out.print(" B: ");
        foundOptional.ifPresent(a -> System.out.println(a.getStatus()));
    }

    public static void main(String[] args) {
        System.out.println("Existing enum: 'A'");
        doCalls("A");
        System.out.println("");
        System.out.println("Non-existing enum: 'B'");
        doCalls("B");
    }
}

Тестовый вывод:

Существующее перечисление: 'A'
Вызов 1: Утверждено
Вызов 2: Утверждено
Вызов 3:
A: Утверждено
B: Утверждено

Несуществующее перечисление: 'B'
Вызов 1: - Не найдено -
Вызов 2: - Не найдено -
Звоните 3:
A: - Не найдено -
B:

1 голос
/ 28 марта 2019

Ваш метод fromString() сравнивает свойство status значений перечисления с переданным параметром:

v.status.equalsIgnoreCase(text)

Таким образом, когда вы передаете "A" как text, это будет сравниваться с "Approved"и "Reject New", и ни один из них не будет совпадать.

Если вы хотите получить перечисление для "A", которое выглядит как имя значения, используйте MyEnum.valueOf("A").

0 голосов
/ 28 марта 2019

простой способ сделать это, а также вы можете сделать его общим, но не рекомендуется

public static MyEnum fromString(String text) {
        try {
            return Enum.valueOf(MyEnum.class, text.toUpperCase());
        } catch (Exception e) {
        }
        return null;
    }

метод вызова

System.out.println(MyEnum.fromString("A"));

вывод:

A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...