【问题标题】:Java Enum to find the Values givng nullJava Enum 查找给出 null 的值
【发布时间】:2019-03-28 09:43:51
【问题描述】:

我有以下代码:当我通过A 时,我想获得值Approved,如果我通过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"));
    }
}

【问题讨论】:

  • 然后使用 v.name().equalsIgnoreCase(text) 。另请注意,MyEnum.valueOf("A") 也会返回预期的枚举值,但区分大小写。
  • "当我通过 A 时,我想获得值 Approved ..." - 这不适合 MyEnum fromString(String text),因为您返回了一个具有值 A 和 R 的 MyEnum 实例。" Approved”是这些值的 String 属性,因此如果您希望您的方法将“A”转换为“Approved”,则返回值也必须是 String

标签: java enums


【解决方案1】:

您正在比较错误的字符串。应该是

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

要获取枚举,您可以使用valueOf

System.out.println(MyEnum.valueOf("A").getStatus()); // prints Approved

【讨论】:

  • 我想通过 A 并获得 Approved 的值。我想要其他方式
  • @PAA 见第二版
  • 不要像这样使用valueOf()。如果您传递一个不存在的值、错误大小写的值或带有额外空格的值,这将导致错误。
  • @GeorgeDerpi 他已经从他的fromString 方法中期待null 值。所以我在这里没有看到任何问题,因为null 是一个有效的回报。
  • 第一个代码暗示他正在根据状态寻找枚举,但它是相反的。 valueOf() 的第二个代码在我之前评论中提到的所有情况下都会崩溃。
【解决方案2】:

不要直接使用valueOf()。 这是区分大小写的,并在找不到对应的enum 时抛出错误。


您需要查找 name 字段,而不是 status 字段:
public static MyEnum fromString(String text) {
        return Arrays.stream(values())
          .filter(v -> v.name().equalsIgnoreCase(text))
          .findFirst()
          .orElse(null);
    }
}

一旦你有你的枚举,调用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 :
答:已批准
B:批准

不存在的枚举:'B'
呼叫 1:- 未找到 -
调用 2:- 未找到 -
呼叫 3 :
答: - 未找到 -
乙:

【讨论】:

    【解决方案3】:

    您的fromString() 方法将枚举值的status 属性与传递的参数进行比较:

    v.status.equalsIgnoreCase(text)
    

    因此,当您将"A" 传递为text 时,它将与"Approved""Reject New" 进行比较,并且两者都不匹配。

    如果您想获取 "A" 的枚举,这似乎是值的名称,请使用 MyEnum.valueOf("A")

    【讨论】:

    • 使用 ValueOf 和 v.name().equalsIgnoreCase(text),在这两种方式中我都没有得到 Approved 值。它不工作
    • @PAA 你可能想分享你的代码。请注意,"Approved" 是枚举的一个属性,而不是它的名称。如果您想获取该字符串,请使用 MyEnum.valueOf("A").getStatus() - 当然您还必须处理 null 情况。
    【解决方案4】:

    简单的方法,你也可以让它通用但不推荐

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 2017-11-17
      • 1970-01-01
      相关资源
      最近更新 更多