满屏的if-else,看我怎么消灭你!
Posted 码农小宋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了满屏的if-else,看我怎么消灭你!相关的知识,希望对你有一定的参考价值。
- 技巧一:提取方法,拆分逻辑
- 技巧二:分支逻辑提前return
- 技巧三:枚举
- 技巧四:函数式接口
- 技巧五:设计模式
- 其他技巧
- 写在最后
在实际的业务开发当中,经常会遇到复杂的业务逻辑,可能部分同学实现出来的代码并没有什么问题,但是代码的可读性很差。
本篇文章主要总结一下自己在实际开发中如何避免大面积的 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 = 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(满屏的if-else,看我怎么消灭你!