来源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的更多相关文章

  1. spfa + slf优化

    最近在练习费用流 , 不是要用spfa吗 ,我们教练说:ns学生写朴素的spfa说出去都让人笑 . QwQ,所以就去学了一下优化 . slf优化就是双向队列优化一下,本来想用lll优化,可是优化后我t ...

  2. MongoDB优化与一些需要注意的细节

    这里总结下这段时间使用mongo的心得,列出了几个需要注意的地方. 1. 系统参数及mongo参数设置 mongo参数主要是storageEngine和directoryperdb,这两个参数一开始不 ...

  3. MongoDB优化心得分享

    这里总结下这段时间使用mongo的心得,列出了几个需要注意的地方. 1. 系统参数及mongo参数设置 mongo参数主要是storageEngine和directoryperdb,这两个参数一开始不 ...

  4. 解决Win7旗舰版开机后无线网络识别非常慢的问题

    最近电脑开机后WIFI识别和连接非常慢,不知何故.查看百度安全卫士的优化记录,发现其禁用了 Network List Service,将该服务设为自动启动,重启服务后,问题解决.PS:如此优化太可恶!

  5. B2B2C商品模块数据库设计

    kentzhu: 在电子商务里,一般会提到这样几个词:商品.单品.SPU.SKU 简单理解一下,SPU是标准化产品单元,区分品种:SKU是库存量单位,区分单品:商品特指与商家有关的商品,可对应多个SK ...

  6. SEO基础内容

     学习SEO人群 网络设计师 网站站长 搜索引擎相关人员 网络营销顾问 企业主 搜索引擎 Yahoo msn google baidu SEM包括SEO,竞价排名等 搜索引擎爬虫流程 派出爬虫-> ...

  7. t-SNE完整笔记

    http://www.datakit.cn/blog/2017/02/05/t_sne_full.html t-SNE(t-distributed stochastic neighbor embedd ...

  8. 移动端热更新方案(iOS+Android)

    PPT资源包含iOS+Android 各种方案分析:https://github.com/qiyer/Share/blob/master/%E7%83%AD%E6%9B%B4%E6%96%B0%E5% ...

  9. [2017BUAA软工]第一次个人项目 数独的生成与求解

    零.Github链接 https://github.com/xxr5566833/sudo 一.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分 ...

随机推荐

  1. js上 八.语句

    1.什么是语句 概念:在JavaScript中表达式是短语,语句就是整句或命令. 作用:用来执行以使某件事发生 特征:用 ; 结尾 Js中语句的常见形式: ü 表达式语句 ü 复合语句 ü 声明语句 ...

  2. 使用BulkLoad恢复hbase数据

    问题: hbase 集群启动不了,maste一直在初始化,数据面临丢失风险. 解决: 把hbfs上 /hbase 目录移走 改名为/hbase-bak 删除zk上的数据,重新建立一个新的hbase集群 ...

  3. 详解Python Google Protocol Buffer

    为什么要使用PB? PB(Protocol Buffer)是 Google 开发的用于结构化数据交换格式,作为腾讯云日志服务标准写入格式.因此用于写入日志数据前,需要将日志原始数据序列化为 PB 数据 ...

  4. CSS鼠标指针cursor样式

    参考来源:W3SCHOOL 有时我们需要在CSS布局时设定特定的鼠标指针样式,这时可以通过设定cursor来实现: url: 需使用的自定义光标的 URL. 注释:请在此列表的末端始终定义一种普通的光 ...

  5. C# 生成图片验证码 图片缩略图 水印

    using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ...

  6. [UWP] - 用Json格式来发送一个Post请求到WCF服务

    测试实体类:(需要在客户端和服务端建了有相同字段名称的实体) public class CompositeType { public CompositeType() { SubCompositeTyp ...

  7. 【程序包管理】Linux软件管理之src源码安装编译

    在很多时候我们需要自定义软件的特性,这时就需要用到源码安装.那么,网上有很多编译源码的工具,那么,我们怎么知道别人使用的是什么工具呢.其实我也不知道(*^▽^*). 那么本篇博客主要是写C代码的源码安 ...

  8. 【进程/作业管理】篇章一:Linux进程及其管理(进程管理类工具)----pstree、ps、top、htop、kill、(killall、pkill、pgrep、pidof)

    主要讲解进程管理类命令及工具的使用:pstree.ps.top.htop.kill.(killall.pkill.pgrep.pidof) pstree 以树状图的方式展现进程之间的派生关系,显示效果 ...

  9. python的常量与变量

    1.Python属于强类型编程语言,Python解释器会根据赋值或运算来自动判断变量的类型.Python还是一种动态类型语言,变量的类型也是可以随时变化的. >>> x=3 > ...

  10. [Python] iupdatable包:Timer 类使用介绍

    iudatable包是我对常用函数进行的封装后发布的一个python包,教程汇总目录: [Python] iupdatable包使用说明 安装 iupdatable 包 pip install iup ...