作者:朱季谦链接:https://www.jianshu.com/p/93a9e0ce019c
(资料图片)
说实话,其实我很讨厌在代码里大量使用if-else,一是因为该类代码执行方式属于面向过程的,二嘛,则是会显得代码过于冗余。这篇笔记,主要记录一些自己在工作实践当中针对if-else的优化心得,将会不定期地长期更新。
看到网上蛮多人推荐使用策略模式来优化if-else,但我总觉得,搞一堆策略类来优化大批量if-else,虽然想法很好,但无意之中很可能又会创造出很多类对象,就显得过于繁重了。若想使用策略模式来优化大批量if-else,其实有一种更好的方式,这是策略模式+枚举方式的改良。
1、根据if-else条件来判断赋值的,如:
Stringid="";if(flag){id="a";}else{id="b";}利用三目运算符,可以直接优化成一行代码:
id=flag?"a":"b";2、利用if-else条件来判断调用方法,如:
Setset1=newHashSet<>();Setset2=newHashSet<>();if(flag){set1.add(id);}else{set2.add(id);} 利用三目运算符,可以直接优化成:
Setset1=newHashSet<>();Setset2=newHashSet<>();(flag?set1:set2).add(id); Jdk1.8新特性Stream流有三个这样API,anyMatch,allMatch,noneMatch,各自的作用如下:
anyMatch:判断条件里任意一个满足条件,则返回true;
allMatch:判断条件里所有都满足条件,则返回true;
noneMatch:判断条件里所有都不满足条件,则返回true;
它们的使用方式其实很简单:
Listlist=Arrays.asList("a","b","c","d","");//任意一个字符串判断不为空则为truebooleananyMatch=list.stream().anyMatch(s->StringUtils.isEmpty(s));//所有字符串判断都不为空则为truebooleanallMatch=list.stream().allMatch(s->StringUtils.isEmpty(s));//没有一个字符判断为空则为truebooleannoneMatch=list.stream().noneMatch(s->StringUtils.isEmpty(s)); 可见,根据以上三种实现方式,可以在某种程度上优化if里判断条件过多的情况,那么,在哪种场景里比较合适利用其优化呢?
在日常实际开发当中,我们可能会看到过这样存在很多判断条件的代码:
if(StringUtils.isEmpty(str1)||StringUtils.isEmpty(str2)||StringUtils.isEmpty(str3)||StringUtils.isEmpty(str4)||StringUtils.isEmpty(str5)||StringUtils.isEmpty(str6)){.....}这时,就可以考虑到,使用stream流来优化,优化后的代码如下:
if(Stream.of(str1,str2,str3,str4,str5,str6).anyMatch(s->StringUtils.isEmpty(s))){.....}这样优化后,是不是就比那堆if里堆积到一块的条件更为优雅了?
当然,这只是针对或条件的,若是遇到与条件时,同样可以用Stream来优化,例如:
if(StringUtils.isEmpty(str1)&&StringUtils.isEmpty(str2)&&StringUtils.isEmpty(str3)&&StringUtils.isEmpty(str4)&&StringUtils.isEmpty(str5)&&StringUtils.isEmpty(str6)){.....}使用Stream优化后:
if(Stream.of(str1,str2,str3,str4,str5,str6).allMatch(s->StringUtils.isEmpty(s))){.....}还有一个判断任意都不为空的操作:
StringUtils.isNoneEmpty(str1,str2,str3)优化量比较多的面向过程的if-else语句,还可以考虑使用Map来优化,虽然在一定程度上,创建一个额外map会占用内存,但那丁点内存对于现阶段计算机而言,可以说不足挂齿。 下面使用一个案例来介绍下————
在一些祖传老代码当中,可能遇到过类似这样又臭又冗余的if-else写法:
publicStringgetDay(Stringday){if("Monday".equals(day)){return"今天上英语课";}elseif("Tuesday".equals(day)){return"今天上语文课";}elseif("Wednesday".equals(day)){return"今天上数学课";}elseif("Thursday".equals(day)){return"今天上音乐课";}elseif("Sunday".equals(day)){return"今天上编程课";}else{......}}这时,可以根据具体场景,来考虑是否可以利用Map优化,使用Map优化的方式,是先在该类中定义一个static的map,类似这样:
publicstaticfinalMapdayMap=ImmutableMap.builder().put("Monday","今天上英语课").put("Tuesday","今天上语文课").put("Wednesday","今天上数学课").put("Thursday","今天上音乐课").put("Sunday","今天上编程课").build(); 定义完后,就直接在先前使用if-else的方法里,进行这样优化:
publicStringgetDay(Stringday){returndayMap.get(day);}这样优化后,业务方法里的判断获取值的处理,是不是就清爽了很多,当然,这只是针对量比较多的if-else而言,若是比较少的判断语句,再额外定义一个map来搞,隐约有画蛇添足的嫌疑。
细心的读者可能会发现, 我在定义map的时候,使用到了一个ImmutableMap的东西,这是Google Guava里的一个类,可生成一个不可变的Map对象,这就意味着,初始化定义后,后续就无法再put修改了,它的这个特性可以保证线程的安全。一般用来替换if-else的map,我们就是要求在初始化定义后,就不会再允许修改了,因此,这个ImmutableMap生成的map,可以很好地帮我们实现这一点。另外,最重要一点是,使用这个ImmutableMap,可以实现链式编程,就像上面定义的链式写法,若是用传统的map定义,就每次都要map.put()、map.put()地赋值。
前面提到过可使用策略枚举来优化大批量的if-else,当然,若只是判断获不同条件来取值的代码,可以考虑直接使用枚举来优化,其效果与map的处理效果类似。
还是用前面判断课程的if-else为案例来优化。
首先,先在类中定义一个枚举:
publicenumdayEnum{Monday("今天上英语课"),Tuesday("今天上语文课"),Wednesday("今天上数学课"),Thursday("今天上音乐课"),Sunday("今天上编程课");publicStringvalue;dayEnum(Stringvalue){this.value=value;}}定义完后,就可以类似前面map的方式,直接将判断值去枚举里获取,然后直接返回获取到的值,这样写法是不是也比较优雅了。
publicStringgetDay(Stringday){returndayEnum.valueOf(day).value;}在实际工作中,我曾经遇到类似这样的代码,看起来像没什么问题,但如果其中某个属性值不幸为null,那么,恭喜你,你将会喜提一个NullPointerException异常。
Stringname=school.getGrades().getStuendt().getName();若要处理这个可能出现的空指针异常,传统写法,可以写一堆if-else语句来处理,就像这样子——
Stringname=null;if(school!=null){Gradesgrade=school.getGrades();if(grade!=null){Studentstudent=grade.getStuendt();if(student!=null){name=student.getName();}}}作为一个极度讨厌if-else的人士,怎么能容忍这一堆层层嵌套的代码存在呢!
在遇到这种层层嵌套的if-else判断时,可以考虑使用jdk1.8新特性Optional 类来优化,优化后的效果如下,顿时又优雅了很多。
Stringname=Optional.ofNullable(school).flatMap(School::getGrades).flatMap(Grades::getStuendt).map(Student::getName).orElse(null);
关键词:
if-else优化实践总结 作者:朱季谦链接:https: www jianshu com p 93a9e0ce019c说实话,其实我很讨厌在代码里大量使用if-el
世界讯息:加拿大皇家银行:上调澳储行终端利率预测至4.35% 加拿大皇家银行首席经济学家Su-LinOng在周五的研究报告中表示,考虑到最近的一些变化,包括今日公布的最低
全球百事通!南华仪器求购嘉得力控股权再度落空 上市8年首亏3313万亟需另谋出路 南华仪器(300417 SZ)对于广东嘉得力清洁科技股份有限公司(以下简称“嘉得力”,831992 NQ)控制权的收购
我国南方地区进入主汛期 今年汛情主要有这些特点 今天(6月1日),我国南方地区进入主汛期。记者从水利部了解到,5月31日到6月4日,我国西南西北等地有一次
交城:情暖“六一”与爱“童”行 6月1日,交城县文化旅游中心、交城县特殊教育学校共同举办“非遗润童心传承靠大家”为主题的“庆六一”研学
天天热推荐:宝宝喜欢吃的卡通馒头,是怎么做的? 主料普通面粉600g白砂糖三汤匙干酵母9g火龙果适量南瓜适量水适量步骤一:南瓜切薄片,上锅蒸烂,大约15分钟
if-else优化实践总结 作者:朱季谦链接:https: www jianshu com p 93a9e0ce019c说实话,其实我很讨厌在代码里大量使用if-el
天天速递!2023国内陶瓷砖企业与行业市场规模调查 陶瓷砖是由粘土和其他无机非金属原料,经成型、烧结等工艺生产的板状或块状陶瓷制品,用于装饰与保护建筑物
5月汽车公司市值榜:特斯拉大涨超1200亿美元 理想汽车升至国内第二-当前热闻 5月汽车公司市值榜:特斯拉大涨超1200亿美元,理想汽车升至国内第二,车市回暖经销商仍承压。
世界快看:首个AI基金经理来了 独立管理5只产品 “业绩能打吗”? 6月1日,北京止于至善投资管理有限公司公告,拟安排公司4位研究员,以及一个基于人工智能的机器人(暂定名
光华股份:公司主营粉末涂料用聚酯树脂,没有光学级PMMA/MS新材料类似产品及相关技术 每经AI快讯,有投资者在投资者互动平台提问:双象股份光学级PMMA MS新材料,贵公司有没有类似产品或相关技
赛微电子:在脑机接口技术体系中,MEMS生物芯片技术已得到应用 每日信息 每经AI快讯,有投资者在投资者互动平台提问:请问,脑机接口是否使用mems相关技术?赛微电子(300456 SZ)6
中油工程:公司的主营业务为石油石化工程建设,公司在境外有相关工程建设业务 每经AI快讯,有投资者在投资者互动平台提问:请问公司产品有出口业务吗?如有,主要出口到哪些国家或地区?
日本国会参议院通过修订版《福岛复兴再生特别措施法》 环球播资讯 据央视新闻,据日本时事通讯社报道,当地时间6月2日,修订版《福岛复兴再生特别措施法》在日本国会参议院全
我国有婴幼儿3200万左右,超三分之一家庭有入托需求 【我国有婴幼儿3200万左右,超三分之一家庭有入托需求】6月2日,2023“婴幼儿照护周”主题宣传活动暨首都托
世界讯息:加拿大皇家银行:上调澳储行终端利率预测至4.35% 加拿大皇家银行首席经济学家Su-LinOng在周五的研究报告中表示,考虑到最近的一些变化,包括今日公布的最低
当前热讯:涨停雷达:房地产个股异动 中交地产触及涨停 今日走势:中交地产(000736)今日触及涨停板,该股近一年涨停14次。异动原因揭秘:1、公司从事主要业务为
“守护宝贝 喜迎六一”——中信银行泰州分行捐赠图书点亮特殊儿童阅读梦 “守护宝贝喜迎六一”——中信银行泰州分行捐赠图书点亮特殊儿童阅读梦
乐健康 | 肥胖、消瘦儿童如何喂养?培养安全型依恋关系,从出生做起!|每日速递 原标题:乐健康|肥胖、消瘦儿童如何喂养?培养安全型依恋关系,从出生做起!工人日报-中工网记者姬薇
精选!大咖作客江博士直播间,深入探讨科学选儿童鞋问题 要想孩子足部健康发育,选对鞋子是重中之重。在“全球爱足日”和“国际儿童节”到来前夕,江博士健康鞋“智选
五连板热门股大跌 脑机概念退潮!锂矿概念活跃 这些概念股估值低至个位数 天天新动态 超12万手封死跌停,五连板热门股大跌,脑机概念退潮!锂矿概念活跃,这些概念股估值低至个位数。
环球观热点:广济药业:拟1000万元设子公司 作为发展中药、保健品等大健康产业载体 广济药业6月2日公告,公司拟出资1000万元设立全资子公司湖北广济健康科技有限公司,将其作为发展中药、保健
速读:长春比亚迪新能源动力电池一期项目一标段厂房移交 【长春比亚迪新能源动力电池一期项目一标段厂房移交】据中建集团官网6月2日消息,近日,中建交通华北公司承
白酒板块午盘小幅拉升 贵州茅台股价增长1.9% 6月2日,白酒板块午盘小幅增长,以2522 07元收盘,涨幅为0 93%。在板块带动下,除岩石股份外,其他白酒股午
比亚迪重要制造基地起火_聚看点 比亚迪工厂起火了!近日,比亚迪西安工厂起火视频在网上流传,现场黑烟滚滚。对此,比亚迪6月2日回应记者称
环球微资讯!辅仁药业因生产、销售劣药被罚145万元 【辅仁药业因生产、销售劣药被罚145万元】信用中国官网显示,辅仁药业集团有限公司因生产、销售劣药清热解
全球百事通!南华仪器求购嘉得力控股权再度落空 上市8年首亏3313万亟需另谋出路 南华仪器(300417 SZ)对于广东嘉得力清洁科技股份有限公司(以下简称“嘉得力”,831992 NQ)控制权的收购
焦点科技(002315)6月2日9点40分触及涨停板_观察 6月2日盘中消息9点40分焦点科技002315触及涨停板目前价格4694上涨1001其所属行业互联网电商目前上涨领涨股
我国南方地区进入主汛期 今年汛情主要有这些特点 今天(6月1日),我国南方地区进入主汛期。记者从水利部了解到,5月31日到6月4日,我国西南西北等地有一次
5月份14%股基上涨 太平光大保德信等产品领涨 世界快播报 5月份14%股基上涨太平光大保德信等产品领涨---太平行业优选A、太平行业优选C以13 00%和12 95%的涨幅遥遥领
世界视点!豆粕领跌 5月饲料原料板块行情走弱 据生意社商品行情分析系统监测数据显示:5月,饲料原料行情涨跌不一,整体反弹乏力,饲料原料指数振荡下跌
昊华科技:5月获近百家机构调研 2023年7个项目将建成投产_热点 昊华科技(600378)发布5月份机构投资者调研记录,博时基金等近百家机构对该上市公司进行调研。昊华科技(6003
每日关注!2023年中国游戏直播平台行业市场分析 游戏直播行业发展至今,在市场反垄断政策下,游戏直播市场充分竞争,整体直播内容格局相对稳定,部分新品蕴
天天热推荐:中国中央空调行业发展现状分析2023 中央空调产品通常可分为离心式冷水机组、风冷螺杆机组、水冷螺杆冷水机组、模块机、多联机、空调末端、单元
中国细胞农业行业市场前瞻分析2023 细胞农业被认为是一种有效的能源利用方法,可以大大降低碳排放,减少能源、水资源、土地资源使用的重要技术
日本国会参议院通过修订版《福岛复兴再生特别措施法》 环球播资讯 据央视新闻,据日本时事通讯社报道...
速读:长春比亚迪新能源动力电池一期项目一标段厂房移交 【长春比亚迪新能源动力电池一期项...
白酒板块午盘小幅拉升 贵州茅台股价增长1.9% 6月2日,白酒板块午盘小幅增长,以...
比亚迪重要制造基地起火_聚看点 比亚迪工厂起火了!近日,比亚迪西...
怎样保存大米一年不坏?真空大米放了3—4年还能吃么? 怎样保存大米一年不坏?1、用锅煮花...
最新消息:河北省40幅摄影作品参加第三十四届华北摄影艺术展览 近日,第三十四届中国华北摄影艺术...
获奖名单公布!第十三届中国艺术节在河北雄安新区落下帷幕 9月15日晚,第十三届中国艺术节在...
2022北京时装周9月15日至22日将在线上线下举办多场活动 一年一度的北京时装盛典即将拉开帷...