1

试图通过其常量参数/字段值(即 value0/value1/value2)找到一个元素而不进行迭代;有办法吗?找到适用于枚举常量名称(即 CONSTANT0/CONSTANT1/CONSTANT2)而不是该名称的参数/字段值的 guava 实用程序方法。

    import com.google.common.base.Enums;

    enum Enum {
        CONSTANT0("value0"), CONSTANT1("value1"), CONSTANT2("value2");
        private final String value;

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

        public String getValue() {
            return value;
        }
    }

    public class Driver {
        public static void main(String[] args) {
            // prints when input is value0
            for (Enum constant : Enum.values()) {
                if (constant.getValue().equalsIgnoreCase(args[0])) {
                    System.out
                            .println("vanilla version works with value i.e. java Driver value0"
                                    + args[0]);
                }
            }
            // prints when input is CONSTANT0
            if (Enums.getIfPresent(Enum.class, args[0]).isPresent())
                System.out
                        .println("guava version works with constant i.e. java Driver CONSTANT0"
                                + args[0]);
        }
    }
4

3 回答 3

2

在没有优雅的专有或库函数的情况下,我建议您使用 Java 8:

Stream.of(Enum.values()).anyMatch(e -> e.getValue().equals("value0"));
于 2015-06-30T15:03:08.460 回答
1

不。

枚举是在 Java 1.5 中设计和引入的,目的是允许开发人员以更简洁的方式枚举其常量。如果您查看Enum.java源代码,您将看不到任何类似于哈希映射的简单查找方法。为了代码清晰,如果你想检查你的枚举是否包含一个值,而不必在每个用例中迭代,你应该创建一个迭代枚举内容的静态方法。

请让我知道,如果你有任何问题!

于 2015-06-27T06:07:27.550 回答
0

基于@Jon Skeet @Patricia Shanahan @Devarsh Desai @ajb的建议

import java.util.EnumMap;
import java.util.Map;

import com.google.common.base.Enums;

enum Enum {
    CONSTANT0("value0"), CONSTANT1("value1"), CONSTANT2("value2");
    private final String value;
    static final Map<Enum, String> enumMap = new EnumMap<Enum, String>(
            Enum.class);

    static {
        for (Enum e : Enum.values())
            enumMap.put(e, e.getValue());
    }

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

    public String getValue() {
        return value;
    }
}

public class Driver {
    public static void main(String[] args) {
        // prints when input is value0
        for (Enum constant : Enum.values()) {
            if (constant.getValue().equalsIgnoreCase(args[0])) {
                System.out
                        .println("vanilla version works with value i.e. java Driver value0 "
                                + args[0]);
            }
        }
        // prints when input is CONSTANT0
        if (Enums.getIfPresent(Enum.class, args[0]).isPresent())
            System.out
                    .println("guava version works with constant i.e. java Driver CONSTANT0 "
                            + args[0]);
        // prints when input is value0
        if (Enum.enumMap.containsValue(args[0]))
            System.out
                    .println("static map version works with value i.e. java Driver value0 "
                            + args[0]);
    }
}
于 2015-06-28T14:53:30.533 回答