如何不使用if/else语句,根据用户输入执行对应的方法?
映射执行方法的实现方案(按常用编程语言分类)
以下方案均基于「键值对映射匹配」逻辑实现,完全替代if/else链式判断,扩展性更强。
Java 实现
使用Map搭配函数式接口存储映射关系,无参无返回值的方法直接用Runnable即可:
import java.util.HashMap; import java.util.Map; public class MethodDispatch { // 全局静态映射表 private static final Map<String, Runnable> METHOD_MAPPING = new HashMap<>(); static { // 注册映射关系 METHOD_MAPPING.put("0", () -> methodA()); METHOD_MAPPING.put("1", () -> methodB()); METHOD_MAPPING.put("2", () -> methodC()); } public static void main(String[] args) { String userInput = "1"; // 模拟用户输入 // 查找方法并执行,同时处理无效输入的兜底逻辑 METHOD_MAPPING.getOrDefault(userInput, () -> System.out.println("输入值无匹配方法")).run(); } private static void methodA() { System.out.println("执行methodA逻辑"); } private static void methodB() { System.out.println("执行methodB逻辑"); } private static void methodC() { System.out.println("执行methodC逻辑"); } }
如果方法需要传参或者有返回值,替换Runnable为对应函数式接口即可:有入参用Consumer、有返回值用Function、同时有入参和返回值也可以自定义函数式接口。
Python 实现
Python中函数是一等公民,直接用字典存储函数对象即可:
def methodA(): print("执行methodA逻辑") def methodB(): print("执行methodB逻辑") def methodC(): print("执行methodC逻辑") # 定义映射字典 method_mapping = { "0": methodA, "1": methodB, "2": methodC } if __name__ == "__main__": user_input = "0" # 模拟用户输入 # 匹配方法并执行,加无效输入兜底 target_method = method_mapping.get(user_input, lambda: print("输入值无匹配方法")) target_method()
如果方法需要传参,调用时直接传递参数即可:target_method(param1, param2)。
JavaScript 实现
可以用普通对象或者ES6的Map结构存储函数映射:
function methodA() { console.log("执行methodA逻辑") } function methodB() { console.log("执行methodB逻辑") } function methodC() { console.log("执行methodC逻辑") } // 定义映射表 const methodMap = new Map([ ["0", methodA], ["1", methodB], ["2", methodC] ]) // 模拟用户输入 const userInput = "2" // 匹配执行 const targetMethod = methodMap.get(userInput) || (() => console.log("输入值无匹配方法")) targetMethod()
通用注意点
- 该方案扩展性远优于if/else链式判断,后续新增映射规则只需要添加键值对即可,不需要修改判断逻辑
- 必须加无效输入的兜底逻辑,避免出现空指针、未定义调用等异常
- 如果方法执行需要上下文参数,可以在注册映射的时候通过闭包传入,或者调用时统一传递参数
内容的提问来源于stack exchange,提问作者NoobieNoob
相关产品推荐
相关产品推荐

