Java enum 根据值查对应值

在Java编程中,enum(枚举)是一种特殊的类,它可以用来定义一组常量。枚举可以提供一种类型安全的方式来表示一组固定的常量值。然而,有时候我们需要根据一个枚举值来查找对应的另一个值,比如根据枚举的序号查找其名称,或者根据名称查找其序号等。本文将介绍如何实现这种需求。

枚举的定义

首先,我们定义一个简单的枚举类型,表示一周的七天:

public enum WeekDay {
    MONDAY(1, "Monday"),
    TUESDAY(2, "Tuesday"),
    WEDNESDAY(3, "Wednesday"),
    THURSDAY(4, "Thursday"),
    FRIDAY(5, "Friday"),
    SATURDAY(6, "Saturday"),
    SUNDAY(7, "Sunday");

    private final int dayNumber;
    private final String dayName;

    WeekDay(int dayNumber, String dayName) {
        this.dayNumber = dayNumber;
        this.dayName = dayName;
    }

    public int getDayNumber() {
        return dayNumber;
    }

    public String getDayName() {
        return dayName;
    }
}

在这个枚举中,我们定义了两个属性:dayNumberdayName,分别表示星期的序号和名称。

根据值查找对应值

接下来,我们介绍两种常见的查找需求:根据序号查找名称,以及根据名称查找序号。

根据序号查找名称

我们可以使用Arrays.stream()filter()方法来实现这个需求:

public static String findDayNameByNumber(int number) {
    return Arrays.stream(WeekDay.values())
                 .filter(day -> day.getDayNumber() == number)
                 .findFirst()
                 .map(WeekDay::getDayName)
                 .orElse(null);
}

这段代码首先将枚举的值转换为流,然后使用filter()方法筛选出序号匹配的枚举值,接着使用findFirst()获取第一个匹配的值,最后通过map()方法获取其名称。

根据名称查找序号

类似地,我们可以使用相同的方法来实现根据名称查找序号的需求:

public static int findDayNumberByName(String name) {
    return Arrays.stream(WeekDay.values())
                 .filter(day -> day.getDayName().equalsIgnoreCase(name))
                 .findFirst()
                 .map(WeekDay::getDayNumber)
                 .orElse(-1); // 如果没有找到,返回-1
}

这段代码的逻辑与上一个示例类似,唯一的区别在于筛选条件和获取的属性。

序列图

下面是一个简单的序列图,展示了如何使用findDayNameByNumber()方法查找星期名称:

sequenceDiagram
    participant User
    participant System
    User->>System: 输入序号 3
    System->>System: 调用 findDayNameByNumber(3)
    System->>User: 返回 "Wednesday"

结语

通过本文的介绍,我们可以看到Java枚举提供了一种类型安全的方式来表示一组固定的常量值,并且可以通过简单的方法实现根据值查找对应值的需求。这不仅可以提高代码的可读性和可维护性,还可以避免硬编码带来的问题。希望本文对您有所帮助!