Java 8如何不使用多重if else/switch实现条件设置变量值
Java 8 替代多重if-else的实现方案
针对你提到的字符串匹配赋值场景,Java 8下有两种更易维护、可读性更高的实现方式,比多重if-else或传统switch更优:
方案1:不可变Map映射(最简洁,适合简单赋值场景)
提前把匹配规则存到不可变Map中,查询效率为O(1),规则修改不需要改动业务逻辑:
import java.util.Map; // 全局预初始化映射关系,程序启动时只会初始化一次 // 如果RequestNumber是字符串类型,把Map泛型改为Map<String, String>,对应值改为"123"、"000"即可 private static final Map<String, Integer> REQUEST_NUM_MAPPING = Map.of( "foo", 123, "bar", 123, "xyz", 456 ); // 业务逻辑处直接调用 int requestNum = REQUEST_NUM_MAPPING.getOrDefault(someString.toLowerCase(), 0); x = someObj.setRequestNumber(requestNum);
方案2:枚举类封装(适合规则复杂、后续可能扩展逻辑的场景)
如果后续匹配规则可能附带其他操作,用枚举把匹配逻辑和对应值封装在一起,可维护性更强:
import java.util.Arrays; import java.util.List; public enum RequestNumEnum { TYPE_FOO_BAR(123, "foo", "bar"), TYPE_XYZ(456, "xyz"), TYPE_DEFAULT(0); private final int requestNum; private final List<String> matchKeys; RequestNumEnum(int requestNum, String... matchKeys) { this.requestNum = requestNum; this.matchKeys = Arrays.asList(matchKeys); } public static int getRequestNum(String input) { String lowerInput = input.toLowerCase(); return Arrays.stream(values()) .filter(item -> item.matchKeys.contains(lowerInput)) .findFirst() .orElse(TYPE_DEFAULT) .getRequestNum(); } public int getRequestNum() { return requestNum; } } // 业务逻辑调用 x = someObj.setRequestNumber(RequestNumEnum.getRequestNum(someString));
两种方案的优势
- 规则与业务逻辑完全解耦,新增/修改匹配规则只需要调整Map或枚举的定义,不需要修改业务执行代码
- 所有映射规则一目了然,可读性远高于嵌套的if-else
- 匹配效率更高,规则越多的场景下,比多重if-else的线性查询优势越明显
内容的提问来源于stack exchange,提问作者Gitesh
相关产品推荐
相关产品推荐

