优化太多的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 预估耗时(分 ...
随机推荐
- [OI笔记]后缀自动机
本来没打算写的,不过想想看后缀自动机的理论看了两三天了才有点懂(我太傻了)-下周期末考的话大概要去复习一下文化课感觉回来又要忘得差不多,还是开篇blog记一下好了. 相关的资料: cls当年的课件:2 ...
- [日常摸鱼]UVA393 The Doors 简单计算几何+最短路
The Boy Next Doors 题意:给定一个固定大小的房间($x,y$的范围都是$[0,10]$),有$n$个墙壁作为障碍(都与横坐标轴垂直),每个墙壁都有两扇门分别用四个点来描述,起点 ...
- 使用php进行微信小程序图片安全验证
想用到微信公众平台的图片识别系统,结果报错{"errcode":41005,"errmsg":"media data missing hint: [x ...
- k8s之深入解剖Pod(二)
目录: Pod配置管理:ConfigMap 容器内获取Pod信息:Downward API Pod生命周期和重启策略 Pod健康检查 一.ConfigMap 将应用所需的配置信息与程序进行分离,可以使 ...
- Gradle 是干什么吃的?
Gradle维基解释:Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML.当前其支 ...
- 学习Python之数据类型
格式化字符串 字符串格式化是一种非常简洁的特性,它能让我们动态更新字符串中的内容.假设我们有从服务器获取的用户信息,并希望根据该信息显示自定义消息,第一个想法是应用字符串连接之类的东西. first_ ...
- Excel-VLOOKUP函数组合应用④
问题场景 查找匹配并返回多列数据,例如:将某个部门所涉及的相关列的数据从[全员数据源]中整理出来,并按照一定顺序,然后发送给各部门的负责人. 场景 从[全员数据源]中共23列数据,整理出[测试部门人员 ...
- Asp.Net Core使用MongoDB
MongoDB 是一个基于分布式且面向文档存储的开源 NoSql数据库系统 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.它支持的数据结构 ...
- asp.net url参数中有中文request.querystring 乱码
说明: 从这点我们发现:所有的参数输入,都调用了一次:HttpUtility.UrlDecode(str2, encoding); 结论出来了: 当客户端js对中文以utf-8编码提交到服务端时,用R ...
- MacOS下解决宿主机和docker容器之间网络互通
docker在Mac下使用非常方便,官网提供了desktop版本的可视化软件,甚至还十分贴心地集成好了k8s套件.然而如果想同时部署和使用多个容器,每个容器不使用127.0.0.1地址,而是各自有ip ...