Java如何实现接收任意Enum为参数、指定头值返回排序枚举列表的方法
实现方案
核心实现逻辑如下:
- 先获取目标枚举类的所有枚举常量,保持枚举定义的原生顺序
- 做入参合法性校验,避免传入不属于当前枚举的头值
- 定位指定头值在原生枚举序列中的索引位置
- 按「头值到末尾 + 开头到头值前一位」的顺序拼接得到最终有序列表
完整代码实现:
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public static <E extends Enum<E>> List<E> enumHeadAsList(final Class<E> val, final E topValue) { // 基础非空校验 if (val == null || topValue == null) { throw new IllegalArgumentException("枚举类和指定头值均不可为null"); } // 获取枚举所有常量,顺序和枚举定义的顺序完全一致 E[] enumConstants = val.getEnumConstants(); if (enumConstants == null || enumConstants.length == 0) { return Collections.emptyList(); } // 查找指定头值在原生枚举序列中的索引 int headIndex = -1; for (int i = 0; i < enumConstants.length; i++) { // 枚举是单例,直接用==比较即可 if (enumConstants[i] == topValue) { headIndex = i; break; } } // 校验头值是否属于当前枚举类 if (headIndex == -1) { throw new IllegalArgumentException(String.format("枚举值[%s]不属于枚举类[%s]", topValue.name(), val.getName())); } // 方式1:普通遍历拼接,兼容所有Java版本 List<E> result = new ArrayList<>(enumConstants.length); // 先添加头值到序列末尾的元素 for (int i = headIndex; i < enumConstants.length; i++) { result.add(enumConstants[i]); } // 再添加序列开头到头值前一位的元素 for (int i = 0; i < headIndex; i++) { result.add(enumConstants[i]); } return result; // 方式2:Java8+ Stream 简化写法,可替换上面的拼接逻辑 // return Stream.concat( // Arrays.stream(enumConstants, headIndex, enumConstants.length), // Arrays.stream(enumConstants, 0, headIndex) // ).collect(Collectors.toList()); }
上述实现完全符合你给出的调用形式,假设BuffType枚举的原生定义顺序为ATK,DEF,SELF,HP,MP,调用enumHeadAsList(BuffType.class, BuffType.SELF)返回的列表顺序为SELF,HP,MP,ATK,DEF。
内容的提问来源于stack exchange,提问作者Tremors94
相关产品推荐
相关产品推荐

