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;
}
}
在这个枚举中,我们定义了两个属性:dayNumber
和dayName
,分别表示星期的序号和名称。
根据值查找对应值
接下来,我们介绍两种常见的查找需求:根据序号查找名称,以及根据名称查找序号。
根据序号查找名称
我们可以使用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枚举提供了一种类型安全的方式来表示一组固定的常量值,并且可以通过简单的方法实现根据值查找对应值的需求。这不仅可以提高代码的可读性和可维护性,还可以避免硬编码带来的问题。希望本文对您有所帮助!