优化太多的if-else
来源java小当家
第1种方法:提前return,减少else判断
1 // 1.优化前
2 private int handlerPre1(boolean flag) {
3 if(flag){
4 // TODO
5 return 0;
6 }else{
7 // TODO
8 return -1;
9 }
10 }
11 // 第1种方法:提前return,减少else判断
12 // 这个做法,将可以return的状态提到if中,直接干掉else
13 private int handlerAfter1(boolean flag) {
14 if(!flag){
15 // TODO
16 return -1;
17 }
18 return 0;
19 }
第2种方法:使用三目运算符
1 // 2.优化前
2 private int handlerPre2(boolean flag) {
3 if(flag){
4 return 0;
5 }else{
6 return -1;
7 }
8 }
9 // 第2种方法:使用三目运算符
10 // 对那些依据状态直接返回某个值的情况非常适用,但如果三目运算符中还镶嵌三目运算,建议不要使用
11 private int handlerAfter2(boolean flag) {
12 return flag?0:-1;
13 }
第3种方法:使用Optional
1 // 3.优化前
2 private Integer handlerPre3(){
3 User user = new User();
4 if(user != null){
5 return user.getAge();
6 }
7 return null;
8 }
9 // 第3种方法:使用Optional
10 // Optional让非空校验更加优雅,代码层面减少了if判断。
11 private Integer handlerAfter3(){
12 User user = new User();
13 Optional<User> optional = Optional.ofNullable(user);
14 return optional.map(User::getAge).orElse(null);
15 }
第4种方法:使用switch
1 // 4.优化前
2 private String getCnPre(String en){
3 String cn;
4 if("student".equals(en)){
5 cn = "学生";
6 }else if("teacher".equals(en)){
7 cn = "教师";
8 }else{
9 cn = "未知";
10 }
11 return cn;
12 }
13
14 // 4.1 优化后 使用switch
15 private String getCnAfter1(String en){
16 switch (en) {
17 case "student":
18 return "学生";
19 case "teacher":
20 return "教师";
21 default:
22 return "未知";
23 }
24 }
第5种方法:使用枚举
1 public enum CnEnum {
2 STUDENT("student","学生"),
3 TEACHER("teacher","教师"),
4 UNKNOWN("unknown","未知");
5 private String en;
6 private String cn;
7
8 public String getEn() {
9 return en;
10 }
11 public void setEn(String en) {
12 this.en = en;
13 }
14 public String getCn() {
15 return cn;
16 }
17 public void setCn(String cn) {
18 this.cn = cn;
19 }
20 CnEnum(String en, String cn) {
21 this.en = en;
22 this.cn = cn;
23 }
24
25 static String of(String en){
26 for (CnEnum temp : CnEnum.values()){
27 if(temp.getEn().equals(en)){
28 return temp.getCn();
29 }
30 }
31 return CnEnum.UNKNOWN.getCn();
32 }
33 }
1 // 4.2 优化前 使用枚举
2 private String getCnAfter2(String en){
3 return CnEnum.of(en);
4 }
第6种方法:使用工厂模式
(1)定义一个职业接口,里面定义一个输出方法
1 public interface Profession {
2 String output();// 输出
3 }
(2)每增加一种职业,都实现这个接口(策略模式)
1 public class Teacher implements Profession{
2 @Override
3 public String output() {
4 return "教书";
5 }
6 }
7
8 public class Student implements Profession{
9 @Override
10 public String output() {
11 return "学习";
12 }
13 }
(3)定义一个工厂类,用来根据具体情况生产各种职业类(工厂模式)
1 public class ProfessionFactory {
2
3 private static Map<String,Profession> map = new HashMap<>();
4 private static final Profession DEFAULT_PROFESSION = new DefaultProfession();
5 static {
6 map.put("student",new Student());
7 map.put("teacher",new Teacher());
8 map.put("default",DEFAULT_PROFESSION);
9 }
10 public static Profession getProfession(String en){
11 Profession profession = map.get(en);
12 return profession == null?DEFAULT_PROFESSION:profession;
13 }
14
15 static class DefaultProfession implements Profession {
16 @Override
17 public String output() {
18 return "未知";
19 }
20 }
21
22 }
(4)测试
1 // 5.优化后 使用 策略模式+工厂模式
2 // 1.定义一个职业接口,里面定义一个输出方法
3 // 2.每增加一种职业,都实现这个接口(策略模式)
4 // 3.定义一个工厂类,用来根据具体情况生产各种职业类(工厂模式)
5 private void handlerAfter5(String en){
6 Profession profession = ProfessionFactory.getProfession(en);
7 System.out.println(profession.output());
8 }
优化太多的if-else的更多相关文章
- spfa + slf优化
最近在练习费用流 , 不是要用spfa吗 ,我们教练说:ns学生写朴素的spfa说出去都让人笑 . QwQ,所以就去学了一下优化 . slf优化就是双向队列优化一下,本来想用lll优化,可是优化后我t ...
- MongoDB优化与一些需要注意的细节
这里总结下这段时间使用mongo的心得,列出了几个需要注意的地方. 1. 系统参数及mongo参数设置 mongo参数主要是storageEngine和directoryperdb,这两个参数一开始不 ...
- MongoDB优化心得分享
这里总结下这段时间使用mongo的心得,列出了几个需要注意的地方. 1. 系统参数及mongo参数设置 mongo参数主要是storageEngine和directoryperdb,这两个参数一开始不 ...
- 解决Win7旗舰版开机后无线网络识别非常慢的问题
最近电脑开机后WIFI识别和连接非常慢,不知何故.查看百度安全卫士的优化记录,发现其禁用了 Network List Service,将该服务设为自动启动,重启服务后,问题解决.PS:如此优化太可恶!
- B2B2C商品模块数据库设计
kentzhu: 在电子商务里,一般会提到这样几个词:商品.单品.SPU.SKU 简单理解一下,SPU是标准化产品单元,区分品种:SKU是库存量单位,区分单品:商品特指与商家有关的商品,可对应多个SK ...
- SEO基础内容
学习SEO人群 网络设计师 网站站长 搜索引擎相关人员 网络营销顾问 企业主 搜索引擎 Yahoo msn google baidu SEM包括SEO,竞价排名等 搜索引擎爬虫流程 派出爬虫-> ...
- t-SNE完整笔记
http://www.datakit.cn/blog/2017/02/05/t_sne_full.html t-SNE(t-distributed stochastic neighbor embedd ...
- 移动端热更新方案(iOS+Android)
PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5% ...
- [2017BUAA软工]第一次个人项目 数独的生成与求解
零.Github链接 https://github.com/xxr5566833/sudo 一.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分 ...
随机推荐
- ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes
这个错误是我在安装ambari平台时,准备为ambari指定mysql数据库时,执行建表语句时遇到的. ERROR 1071 (42000): Specified key was too long; ...
- hive中的虚拟列
hive为用户提供了三个虚拟列:用户可以通过这三个虚拟列确定记录是来自哪个文件以及这条记录的具体位置信息 INPUT__FILE__NAME 返回记录所在的具体hdfs文件全路径 hive> s ...
- js下 Day01、DOM对象,BOM浏览器对象模型
一.初识DOM 1.什么是DOM?为什么学习DOM 2.DOM是实现js在网页实现交互的关键环节,我们的js代码就是通过DOM的方法来实现对于html内容的操作. 3.认识DOM实现了js和网页结合的 ...
- [日常摸鱼]bzoj1502[NOI2005]月下柠檬树-简单几何+Simpson法
关于自适应Simpson法的介绍可以去看我的另一篇blog http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题意:空间里圆心在同一直线上且底面 ...
- 多任务-python实现-UDP多线程聊天(2.1.6)
@ 目录 1.案例 1.案例 代码实现 import threading import time import socket def rev_msg(udp_socket): while True: ...
- 302跳转导致的url劫持
介绍一个 网站监测工具:iis7网站监测IIS7网站监控工具可以做到提前预防各类网站劫持,并且是免费在线查询,适用于各大站长,政府网站,学校,公司,医院等网站.它可以做到24小时定时监控,同时它可 ...
- 使用gitlab-runner本地验证.gitlab-ci.yml
背景 在gitlab上配置新项目的CI的时候,需要编写项目的 .gitlab-ci.yml 文件. 每次修改 .gitlab-ci.yml 文件之后都要执行git push让GitLab去构建来验证当 ...
- 在飞儿云主机里使用酷Q时遇到相关问题的解决办法
情况1:酷Q Air版本可以使用,而Pro版本无法运行 解决方法如下: p.p1 { margin: 0; font: 13px "Helvetica Neue"; color: ...
- Android基础工具移植说明
早前开展的计划因各种杂事而泡汤,而当遇到了具体任务后,在压力下花了两个多周的业余时间把这件事完成了. 这就是我的引以为傲的Mercury-Project,它的核心目标是移植一些Android底层轮子到 ...
- Salesforce LWC学习(三十) lwc superbadge项目实现
本篇参考:https://trailhead.salesforce.com/content/learn/superbadges/superbadge_lwc_specialist 我们做lwc的学习时 ...