大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述满屏的if-else,看我怎么消灭你!相关的知识,希望能为你提供帮助。
- 技巧一:提取方法,拆分逻辑
- 技巧二:分支逻辑提前return
- 技巧三:枚举
- 技巧四:函数式接口
- 技巧五:设计模式
- 其他技巧
- 写在最后
【满屏的if-else,看我怎么消灭你!】本篇文章主要总结一下自己在实际开发中如何避免大面积的 if-else 代码块的问题。补充说明一点,不是说 if-else 不好,而是多层嵌套的 if-else 导致代码可读性差、维护成本高等问题。
现有如下一段示例代码,部分优化技巧是根据这段代码进行的:
public class BadCodeDemo
private void getBadCodeBiz(Integer city, List< TestCodeData> newDataList, List< TestCodeData> oldDataList)
if (city != null)
if (newDataList != null & & newDataList.size() > 0)
TestCodeData newData = https://www.songbingjia.com/android/newDataList.stream().filter(p ->
if (p.getIsHoliday() == 1)
return true;
return false;
).findFirst().orElse(null);
if (newData != null)
newData.setCity(city);
else
if (oldDataList != null & & newDataList != null)
List< TestCodeData> oldCollect = oldDataList.stream().filter(p ->
if (p.getIsHoliday() == 1)
return true;
return false;
).collect(Collectors.toList());
List< TestCodeData> newCollect = newDataList.stream().filter(p ->
if (p.getIsHoliday() == 1)
return true;
return false;
).collect(Collectors.toList());
if (newCollect != null & & newCollect.size() > 0 & & oldCollect != null & & oldCollect.size() > 0)
for (TestCodeData newPO : newCollect)
if (newPO.getStartTime() == 0 & & newPO.getEndTime() == 12)
TestCodeData po = oldCollect.stream().filter(p -> p.getStartTime() == 0
& & (p.getEndTime() == 12 || p.getEndTime() == 24)).findFirst().orElse(null);
if (po != null)
newPO.setCity(po.getCity());
else if (newPO.getStartTime() == 12 & & newPO.getEndTime() == 24)
TestCodeData po = oldCollect.stream().filter(
p -> (p.getStartTime() == 12 || p.getStartTime() == 0)
& & p.getEndTime() == 24).findFirst().orElse(null);
if (po != null)
newPO.setCity(po.getCity());
else if (newPO.getStartTime() == 0 & & newPO.getEndTime() == 24)
TestCodeData po = oldCollect.stream().filter(
p -> p.getStartTime() == 0 & & p.getEndTime() == 24).findFirst().orElse(null);
if (po == null)
po = oldCollect.stream().filter(
p -> p.getStartTime() == 0 & & p.getEndTime() == 12).findFirst().orElse(null);
if (po == null)
po = oldCollect.stream().filter(
p -> p.getStartTime() == 12 & & p.getEndTime() == 24).findFirst().orElse(null);
if (po != null)
newPO.setCity(po.getCity());
else if (newPO.getTimeUnit().equals(Integer.valueOf(1)))
TestCodeData po = oldCollect.stream().filter(
e -> e.getTimeUnit().equals(Integer.valueOf(1))).findFirst().orElse(null);
if (po != null)
newPO.setCity(推荐阅读
- Linux 内核 内存管理物理分配页 ⑧ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | 获取首选内存区域 | 异步回收内存页 | 最低水线也分配 | 直接分配 )
- Linux 内核 内存管理物理分配页 ③ ( 物理页分配标志位分析 | ALLOC_WMARK_MIN | ALLOC_WMARK_MASK | ALLOC_HARDER )
- Linux 内核 内存管理物理分配页 ⑥ ( get_page_from_freelist 快速路径调用函数源码分析 | 检查内存区域水线 | 判定节点回收 | 判定回收距离 | 回收分配页 )
- Linux 内核 内存管理分区伙伴分配器 ⑤ ( 区域水线 | 区域水线数据结构 zone_watermarks 枚举 | 内存区域 zone 中的区域水线 watermark 成员 )
- Linux 内核 内存管理分区伙伴分配器 ⑥ ( zone 结构体中水线控制相关成员 | 在 Ubuntu 中查看内存区域水位线 )
- SpringBoot--JWT的后端搭建前后分离
- 从面试角度一文学完Kafka
- Linux 内核 内存管理分区伙伴分配器 ⑦ ( z->watermark[WMARK_MIN] 最低水位计算 | min_free_kbytes 初始化 )
- Redis实现并发阻塞锁方案