前言

对接物联网设备,设备传递命令,然后根据命令操作不同的行为,最后返回。
现在问题是if else 太多了,代码太长,项目不好维护和扩展,代码如下:

public static String execute(String command, String jsonStr){if ("openDoor".equals(command)) {// 具体业务代码会比较多,这里只是做一个简单的代码框架例子。return "开门";} else if ("closeDoor".equals(command)) {// 业务逻辑代码省略...return "关门";} else if ("addUser".equals(command)) {// 业务逻辑代码省略...return "添加用户";} else if ("removeUser".equals(command)) {// 业务逻辑代码省略...return "删除用户";} else if ("addFace".equals(command)) {// 业务逻辑代码省略...return "添加人脸";}return "未找到命令";
}

方案一:通过枚举来优化

enum Action {openDoor(jsonStr -> {// 业务逻辑代码省略...return "开门";}),closeDoor(jsonStr -> {// 业务逻辑代码省略...return "关门";}),addUser(jsonStr -> {// 业务逻辑代码省略...return "添加用户";})// ....;private Function<String, String> function;Action (Function<String, String> function) {this.function = function;}/*** 提供执行命令的方法* @param commandStr* @param jsonStr* @return*/public static String execute(String commandStr, String jsonStr) {try {Action action = Action.valueOf(commandStr);return action.function.apply(jsonStr);} catch (IllegalArgumentException e) {}return "未找到指令";}}// 代码优化成这样public static String executeTest(String command, String jsonStr){return Action.execute(command, jsonStr);}

该段代码去掉了全部的if else,核心利用Enum.valueOf来找到具体的事件并执行。

测试输出:

// 测试枚举类,优化if else
String str = Action.execute("addUser", "");// 添加用户
// String str = Action.execute("test", ""); // 未找到指令
System.out.println(str);

方案二:Map结合函数式编程

使用enum不适用我的业务,我打算将这块封装成一个公共包,但是枚举不能继承只能实现接口,
如果后期扩展用了就需要改枚举,或者重新定义一个枚举(如果给到别人使用还需要沟通好枚举定义规范)。

interface IAction {public static Map<String, Function<String, String>> map = new HashMap<>();// 提供执行的方法封装public static String execute(String commandStr) {Function<String, String> function = map.get(commandStr);if (function == null) {return "未找到指令";}return function.apply(commandStr);}}static {IAction.map.put("openDoor", jsonObject -> {// 业务逻辑代码省略...return "开门";});IAction.map.put("closeDoor", jsonObject -> {// 业务逻辑代码省略...return "关门";});IAction.map.put("addUser", jsonObject -> {// 业务逻辑代码省略...return "添加用户";});}
// 测试Map 函数式编程
String addUser = IAction.execute("addUser");
System.out.println(addUser);

其它

可以结合工厂模式 + 策略模式,本文不做描述。使用这两种设计模式缺点:需要添加接口和定义很多类会使系统变的复杂。

另外设计模式的诞生是在Java早期语法糖不丰富用来优化代码的,现在Java新特性之后可以替代部分设计模式。

如:枚举可以替代单例模式。

利用Java8优化if else相关推荐

  1. mysql key value 排序_MySQL利用索引优化ORDER BY排序语句的方法

    创建表&创建索引 create table tbl1 ( id int unique, sname varchar(50), index tbl1_index_sname(sname desc ...

  2. html优化网站的方法,利用HTML优化加快网页速度方法介绍

    减少web页面下载时间的关键就是设法减小文件大小.当多个页面共用一些成分内容时,就可以考虑将这些公用部分单独分离出来.比如:我们可以将多个HTML页面都用到的脚本程序编写成独立存在的.js文件,然后再 ...

  3. MySQL-索引优化篇(3)_利用索引优化锁

    文章目录 生猛干货 官方文档 利用索引优化锁 为什么索引能优化锁 演示 无索引的情况 (获取不同的数据 发生了阻塞) 有索引的情况 (获取不同的数据 未阻塞) 搞定MySQL 生猛干货 带你搞定MyS ...

  4. CUDA实例系列三:利用GPU优化向量规约问题

    CUDA实例系列三:利用GPU优化向量规约问题 先简单的描述一下题目中说的向量规约问题. 这里举个例子, 比如: 我要求出1+2+3-+100的和 我要求出123-*100的积 我要找到a[100]中 ...

  5. Tabu搜索(TS—Tabu search)算法是近年来出现的用于求解组合优化问题的一种高效的启发式搜索技术。 本文采用固定并联电容器作为研究对象对系统进行无功补偿,并利用智能优化方法得到使配电网损耗

    禁忌搜索算法解决配电网无功优化问题对应的MATLAB源码,有对应的参考资料. 电力系统配电网的无功优化规划是保证配电网安全.经济运行的一项有效手段,是降低网损.提高电压质量的重要措施. 因此,电力系统 ...

  6. 如何利用UWA优化物理开销

    这是第162篇UWA技术知识分享的推送.今天我们继续为大家精选了若干和开发.优化相关的问题,建议阅读时间10分钟,认真读完必有收获. UWA 问答社区:answer.uwa4d.com UWA QQ群 ...

  7. java8 优化嵌套循环

    java8 优化嵌套循环 1.问题背景: 需要map类型的数据,同时key的值必须是连续的,但是根据数据库查出的时间并不能连续(如:dtos),所以会有两个循环,但是由于这两个循环的长度不一致,而且内 ...

  8. 如何利用SEO优化技巧做手机淘宝产品的排名

    在今年的双十一活动中,淘宝双十一购物狂欢节总交易额高达571亿,无线端贡献243亿,占比42.6%,去年无线端占比为15.3%,增长速度几乎为两倍,这是一组让人惊奇而耐人寻味的数字,它又意味着手机淘宝 ...

  9. 利用Runloop优化流畅度

    利用Runloop优化流畅度 我们可以对runloop添加观察者,当观察到状态为kCFRunLoopExit,kCFRunLoopBeforeWaiting的时候,做一些耗时的处理,废话不说,直接上代 ...

最新文章

  1. 高分辨率、实时的手持物体360°三维模型重建结构光技术
  2. keras inceptionv1 到 inceptionv4演化
  3. 闪回表操作语法+使用闪回删除
  4. linux模式匹配运算符,linux之正则表达式
  5. Zeusee 开源移动端车型识别系统HyperVID
  6. 全面拥抱云原生应用研发的拐点已经到来
  7. Java开发笔记(一百四十四)实现FXML对应的控制器
  8. 将Ext JS 5应用程序导入Web项目以及实现本地化
  9. Inferred type 'S' for type parameter 'S' is not within its bound;
  10. 《数据库原理》课程设计报告
  11. ubuntu 安装咖啡壶-chemex命令详解
  12. 显示隐藏文件夹,Mac显示.m2文件夹
  13. 让声音更清晰,用PR去掉视频中的噪音
  14. 如何用待办工具组织每周的任务清单
  15. 8大预测分析工具比较
  16. CTF Reverse fantasy.apk解题思路
  17. AMD EPYC 7763/7T83/7713/7H12/7742 双路 8卡GPU服务器aleo
  18. 093【RTKLIB源码之postpos-9】刨根问底
  19. Python 实现常见的坐标系之间的转换
  20. 转型产品经理需要考NPDP吗?

热门文章

  1. 用java写一个猜拳小游戏
  2. vscode 插件摘抄
  3. webpack打包5之配置清除dist目录插件
  4. Mock框架Mockito入门教程
  5. Spring Cloud 20000 字总结
  6. 6.0、软件测试——判定表法
  7. 托福阅读考试做题步骤
  8. 完整HTML实例网页代码(4)
  9. 网络设置及其修改配置文件全程实操,可跟做
  10. 虚拟串口仿真:Internal Exception: access violation in module ‘DSIM.DLL‘ [00002C82].