Java中如何移除重复条件检查?如何避免在指定三元表达式中重复校验CommonCondition的值?
移除重复条件检查的几种方案
你的这段嵌套三元运算符代码确实存在重复检查CommonCondition的问题,不仅看起来臃肿,后续维护也容易出错——万一以后要修改CommonCondition的判断逻辑,你得改6次,太麻烦了。下面给你几种优雅的重构方式:
方案1:提前分支确定候选操作,统一检查CommonCondition
核心思路是先根据Condition1和Condition2确定两种场景(CommonCondition为true/false)下对应的操作,最后只做一次CommonCondition判断即可:
假设你的doThisX方法都返回同一类型的结果(比如叫TaskType),可以用Supplier来延迟执行操作(和原三元运算符的惰性执行行为保持一致):
// 先根据外层条件确定两个候选操作 Supplier<TaskType> whenCommonTrue; Supplier<TaskType> whenCommonFalse; if (Condition1) { whenCommonTrue = this::doThis1; whenCommonFalse = this::doThis2; } else if (Condition2) { whenCommonTrue = this::doThis3; whenCommonFalse = this::doThis4; } else { whenCommonTrue = this::doThis5; whenCommonFalse = this::doThis6; } // 只检查一次CommonCondition,执行对应操作 var Task = CommonCondition ? whenCommonTrue.get() : whenCommonFalse.get();
如果doThisX是没有返回值的方法,把Supplier换成Runnable,调用run()方法就行。
方案2:用自定义类/Record封装操作对(Java 16+推荐)
如果觉得两个单独的变量不够直观,可以用Java 16引入的Record来封装两种场景的操作,让代码更具可读性:
// 定义一个Record来封装CommonCondition为true/false时的操作 private record TaskActions<T>(Supplier<T> onCommonTrue, Supplier<T> onCommonFalse) {} // 确定对应的操作对 TaskActions<TaskType> taskActions = switch (true) { case Condition1 -> new TaskActions<>(this::doThis1, this::doThis2); case Condition2 -> new TaskActions<>(this::doThis3, this::doThis4); default -> new TaskActions<>(this::doThis5, this::doThis6); }; // 执行最终操作 var Task = CommonCondition ? taskActions.onCommonTrue().get() : taskActions.onCommonFalse().get();
这里用switch表达式(Java 14+支持)代替if-else,代码会更简洁。如果是Java版本低于14,换回if-else分支就行。
方案3:提取成独立方法(更易复用)
如果这段逻辑在多个地方用到,可以把整个逻辑提取成一个独立方法,进一步提高代码复用性:
private TaskType getTask(boolean condition1, boolean condition2, boolean commonCondition) { Supplier<TaskType> whenCommonTrue; Supplier<TaskType> whenCommonFalse; if (condition1) { whenCommonTrue = this::doThis1; whenCommonFalse = this::doThis2; } else if (condition2) { whenCommonTrue = this::doThis3; whenCommonFalse = this::doThis4; } else { whenCommonTrue = this::doThis5; whenCommonFalse = this::doThis6; } return commonCondition ? whenCommonTrue.get() : whenCommonFalse.get(); } // 调用时直接传入参数 var Task = getTask(Condition1, Condition2, CommonCondition);
为什么这些方案更好?
- 消除了重复的
CommonCondition检查,减少冗余代码 - 逻辑分层清晰:外层处理
Condition1/Condition2的分支,内层只处理一次CommonCondition判断 - 维护性更高:以后修改
CommonCondition的逻辑,只需要改一处;修改分支逻辑也只需要对应修改外层的部分
内容的提问来源于stack exchange,提问作者TABHSA
相关产品推荐
相关产品推荐

