用 HashMap 替代 if-else/swtich,将“条件值→处理逻辑”映射为键值对,配合函数式接口封装行为;推荐枚举作 key 提升类型安全;需注意兜底处理、异常设计及顺序敏感场景。

用 HashMap 替代多重 if-else 或 switch,核心是把“条件值 → 处理逻辑”抽象成键值对,让运行时查表代替编译期分支跳转。它不写死流程,而是靠 key 定位行为,结构更松、扩展更轻、维护更稳。
用函数式接口封装行为
把每种条件对应的操作封装成 Function、Consumer 或自定义函数接口实例,存进 HashMap:
- key 是条件值(如字符串命令、状态码、枚举常量)
- value 是 Lambda 或方法引用,代表该条件下的执行逻辑
- 调用时直接
handlers.getOrDefault(key, defaultHandler).apply(input)
例如处理不同订单状态的发货动作:
MapstatusHandlers.put("PAID", order -> sendGoods(order));
statusHandlers.put("REFUNDED", order -> cancelLogistics(order));
statusHandlers.put("CANCELLED", order -> cleanInventory(order));
// 执行
statusHandlers.getOrDefault(order.getStatus(), o -> {}).accept(order);
配合枚举 + 静态映射提升类型安全
避免字符串硬编码出错,推荐用枚举作 key,并在枚举内部预置 handler:
- 每个枚举项自带业务逻辑,初始化时就绑定好行为
- 查找直接
Status.valueOf(code).handle(order),无需外部 map 查找 - 编译期检查 key 合法性,IDE 可自动补全,重构友好
这样既保留了映射的灵活性,又规避了字符串 magic value 的风险。
处理需要返回值或异常的场景
若分支逻辑需返回结果或抛出特定异常,value 类型可升级为 Supplier
-
Map:适合无参计算> resultProviders -
Map:带上下文参数并返回响应> - 统一异常处理可在调用层包裹 try-catch,或让 handler 内部处理
比起层层嵌套的 if-else,这种结构让“什么条件走什么路”一目了然,新增分支只需加一行 put,不碰原有逻辑。
注意边界与兜底设计
真实业务中不能假设所有 key 都存在:
- 务必使用
getOrDefault(key, fallback),避免 NPE - fallback 可是空操作、日志告警、抛运行时异常,视语义而定
- 对非法 key 建议记录 warn 日志,便于发现配置遗漏或上游传参错误
另外,HashMap 本身不保证顺序,如果执行顺序敏感(比如有优先级 fallback 链),就得换 LinkedHashMap 或显式排序逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











