如何用Java 8重构含多条件判断与List对象的高性能方法
重构方案
针对你的方法,用Java 8实现最优性能重构的核心思路是用预初始化的不可变映射替代条件判断,既提升扩展性,也保证查找性能:
重构后代码
public static final String COMPETITION_AGE_18_30 = "compet1"; public static final String COMPETITION_AGE_30_40 = "compet2"; // 预初始化不可变映射,仅在类加载时初始化一次 private static final Map<String, List<Competition>> COMPETITION_MAPPING; static { Map<String, List<Competition>> tempMap = new HashMap<>(); // 存入18-30岁对应的竞赛列表,转成不可变列表避免外部修改 tempMap.put(COMPETITION_AGE_18_30, Collections.unmodifiableList(Arrays.asList( CompetitionNatation, CompetitionFoot, CompetitionHand, CompetitionNatation ))); // 存入30-40岁对应的竞赛列表,用singletonList优化单个元素的列表 tempMap.put(COMPETITION_AGE_30_40, Collections.unmodifiableList(Collections.singletonList(CompetitionRoller))); // 把整个映射转成不可变,防止后续被修改 COMPETITION_MAPPING = Collections.unmodifiableMap(tempMap); } // 修正原方法名的笔误(原方法名多了一个s) public List<Competition> getCompetitions(String competAge) { // 直接通过映射查找,找不到返回空的不可变列表 return COMPETITION_MAPPING.getOrDefault(competAge, Collections.emptyList()); }
重构优势
- 性能最优:映射的查找时间复杂度是O(1),比原有的if-else线性判断更高效(尤其是后续扩展更多年龄组时优势更明显);所有列表和映射仅在类加载时初始化一次,避免每次调用方法时重复创建集合实例。
- 扩展性强:新增年龄组时,只需在静态初始化块中添加一条映射关系,无需修改方法内部逻辑,符合开闭原则。
- 线程安全:所有集合都是不可变的,静态初始化的映射在多线程环境下可以安全访问,没有并发修改风险。
- 代码简洁:去掉冗余的条件分支,逻辑更清晰。
注意点
- 原代码中
CompetitionNatation重复出现了两次,如果你是笔误,可以去掉重复项;如果是业务需要保留重复元素,就保持原样。 - 如果你的项目已经使用Java 9+,可以用
List.of()替代Arrays.asList()和Collections.singletonList(),用Map.of()简化映射初始化,代码会更简洁:
// Java9+ 简化版初始化 private static final Map<String, List<Competition>> COMPETITION_MAPPING = Map.of( COMPETITION_AGE_18_30, List.of(CompetitionNatation, CompetitionFoot, CompetitionHand, CompetitionNatation), COMPETITION_AGE_30_40, List.of(CompetitionRoller) );
内容的提问来源于stack exchange,提问作者obela06
相关产品推荐
相关产品推荐

