【问题标题】:How can we compare a string with the values of enum elements in Java我们如何将字符串与 Java 中的枚举元素的值进行比较
【发布时间】:2019-09-20 07:07:30
【问题描述】:

我有一个枚举 Foo

public enum Foo {

    A("first"),

    B("second"),

    private final String value;

    private Foo(String value) {
        this.value = value;
    }

    public String value() {
        return this.value;
    }

}

下面我试图检查一个字符串是否包含在我的枚举中。

public boolean isValidFoo(String fooStr) {
return EnumSet.allOf(Foo.class)
                        .contains(Foo.valueOf(fooStr.toUpperCase()));
}

当我为fooStr 发送AB 时,此方法有效。 当我为fooStr 发送firstsecond 时如何使它工作?

【问题讨论】:

  • 不要调用valueOf(),调用value();这是返回值的方法的名称。更好的是,将它重命名为 getValue(),它会让区别更加清晰
  • 您可以使用Arrays.stream(Foo.values()).map(Foo::value).collect(toSet()) 创建一个Set,将此Set 存储在某个静态字段中,然后使用theSet.contains(fooStr)
  • 可能性,取决于用法:使用带有映射和过滤器的流来查找枚举;静态HashMap开始 映射值到枚举时创建;一个静态的Set 也在 start 创建,包含所有值;或...
  • @Stultuske 我不明白打电话给value 会有什么帮助? (contains 检查枚举实例)
  • @CarlosHeuberger 这是他的吸气剂的名字,这就是他获得价值的方式。

标签: java enums


【解决方案1】:

你可以试试这个..

public boolean isValidFoo(String fooStr) {
    return Arrays.stream(Foo.values())
            .anyMatch(e -> e.value.equals(fooStr));
}

【讨论】:

  • 添加map(Foo::value)而不是使用e.value(使用功能时,让我们保持功能)
【解决方案2】:

你可以添加一个方法

  public static Foo getEnum(String value) {
        for (Foo foo : Foo.values()) {
            if (foo.value.equals(value)) {
                return foo;
            }
        }
        return null;
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多