优化 if elsehttps://blog.csdn.net/FBB360JAVA/article/details/103832405

利用java8特性优化: https://blog.csdn.net/sco5282/article/details/118639405

参考:《阿里巴巴java编码规范》、《设计模式》(清华大学出版)、https://blog.csdn.net/mifffy_java/article/details/95201289

1、 阿里编程归约

说明:如果不得不使用 if()...else if()...else... 方式表达逻辑,【强制】避免后序代码维护困难,请勿超过3层。

正例:超过3层的 if else 逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现,其中卫语句示例如下:

public void today(){
if(isBusy()){
System.out.println("change time.");
return;
}

2、 switch 语句

多个if else的,使用switch case 语句:

switch(status){
case 'A':
functionA();
break;
case 'B':
functionB();
break;
case 'C':
functionC();
break;
default:
break;
}

3、数组

来自google解释,这是一种编程模式,叫做表驱动法,本质是从表里查询信息来代替逻辑语句。

【案例1】

定义一个接口数组,这是一个函数式接口,其中的方法是单参数无返回值的。

可以使用不同的样式打印传入的参数:

Consumer[] consumers = {
System.out::println,
arg -> System.out.println("[" + arg + "]"),
arg -> System.out.println("(" + arg + ")"),
arg -> System.out.println("{" + arg + "}")
}; for (Consumer consumer : consumers) {
consumer.accept("这句话会打印出来");
}

【案例2】

if else 的写法:定义一个方法,获取星期数。

private static String getWeekDay(int weekStat) {
if (0 == weekStat) {
return "星期天";
}
if (1 == weekStat) {
return "星期一";
}
if (2 == weekStat){
return "星期二";
}
if (3 == weekStat){
return "星期三";
}
if (4 == weekStat){
return "星期四";
}
if (5 == weekStat){
return "星期五";
}
if (6 == weekStat){
return "星期六";
}
return null;
} // 使用该方法获取星期一
int weekStat = 1;
String weekDay = getWeekDay(1);
System.out.println(weekDay); 使用数组优化: String[] week = {
"星期天",
"星期一",
"星期二",
"星期三",
"星期四",
"星期五",
"星期六"
}; // 使用数组获取星期一
int weekStat = 1;
String weekDay = week[weekStat];
System.out.println(weekDay)

4、Optional解决判空的if else

环境:基于 jdk8 (高版本还有更厉害、方便的方法,这里不做讨论)

String pictureName = "真香.png";
// 当其不为空时,打印在控制台
Optional.of(pictureName).ifPresent(System.out::println); /**
* 举个例子:实体类;篇幅原因就不写get set方法了。
*/
class User {
String name;
String password;
} public class Demo {
public static void main(String[] args) {
User user = new User();
user.name = "小冯"; // 过滤到密码是 123456 的目标用户
// 若用户不为 null 则打印用户信息
Optional.of(user)
.filter(u -> "123456".equals(u.password))
.ifPresent(System.out::println); // 当用户名存在时,打印用户名
Optional.of(user).map(u -> u.name).ifPresent(System.out::println);
}
}

5、策略设计模式

5.1 枚举实现

定义一个枚举类:

/**
* 定义了一周的每一天要干什么
*/
enum WeekDay {
/**星期天要作甚?*/
Sunday("Sunday"){
@Override
void weekRun() {
System.out.println(weekName + ":和朋友出去玩!");
}
},
/**星期1要作甚?*/
Monday("Monday"){
@Override
void weekRun() {
System.out.println(weekName + ":在学校学习英语");
}
},
/**星期2要作甚?*/
Tuesday("Tuesday"){
@Override
void weekRun() {
System.out.println(weekName + ":在学校学习java");
}
},
/**星期3要作甚?*/
Wednesday("Wednesday"){
@Override
void weekRun() {
System.out.println(weekName + ":在学校学习语文");
}
},
/**星期4要作甚?*/
Thursday("Thursday"){
@Override
void weekRun() {
System.out.println(weekName + ":在学校学习历史");
}
},
/**星期5要作甚?*/
Friday("Friday"){
@Override
void weekRun() {
System.out.println(weekName + "在学校玩");
}
},
/**星期6要作甚?*/
Saturday("Saturday"){
@Override
void weekRun() {
System.out.println(weekName + "和朋友在家看电影");
}
}; public String weekName;
abstract void weekRun();
WeekDay(String weekName){
this.weekName = weekName;
}
}
使用该枚举类: public class Demo {
public static void main(String[] args) {
// 调用的写法1
WeekDay.valueOf("Sunday").weekRun();
// 调用的写法2
WeekDay.Monday.weekRun();
}
}

5.2 多态实现

/**
* 跑的行为抽象
*/
@FunctionalInterface
interface RunStrategy {
void run();
} 针对该行为抽象,有几种实现: /**
* 人跑的行为
*/
class PeopleRunStrategy implements RunStrategy {
@Override
public void run() {
System.out.println("人用腿跑");
}
} /**
* 汽车跑的行为
*/
class CarRunStrategy implements RunStrategy { @Override
public void run() {
System.out.println("汽车用轮子跑");
}
} /**
* 鱼跑的行为
*/
class FishRunStrategy implements RunStrategy { @Override
public void run() {
System.out.println("鱼在水里游");
}
}
调用: RunStrategy peopleRun = new PeopleRunStrategy();
peopleRun.run();

5.3 map 优化

针对 5.2 多态实现的策略设计模式,使用映射来调用:

Map<String, RunStrategy> runStrategyMap = new HashMap<>(16);
runStrategyMap.put("people", new PeopleRunStrategy());
runStrategyMap.put("car", new CarRunStrategy());
runStrategyMap.put("fish", new FishRunStrategy()); // 获取汽车的跑的实现,当没有该实现时,调用人的跑的实现
RunStrategy runStrategy1 = runStrategyMap.getOrDefault("car", new PeopleRunStrategy());
// 获取鸟的跑的实现,当没有该实现时,调用人的跑的实现
RunStrategy runStrategy2 = runStrategyMap.getOrDefault("bird", new PeopleRunStrategy());
// 打印:汽车用轮子跑
runStrategy1.run();
// 打印:人用腿跑
runStrategy2.run();
5.4 工厂设计模式优化
接口与实现类: 与 5.2 中的【案例2】一致。 工厂类: /**
* 工厂类
*/
class RunStrategyFactory {
private RunStrategyFactory(){} private static final Map<String, RunStrategy> RUN_STRATEGY_MAP = new ConcurrentHashMap<>(16);
/*
* 初始化数据:在Spring框架中,使用反射扫描了包、类,
* 再通过类名反射出目标对象,这里使用静态代码块代替这一步骤,
* 直接将对象放入 map 容器中。
*/
static {
RUN_STRATEGY_MAP.put("peopleRunStrategy", new PeopleRunStrategy());
RUN_STRATEGY_MAP.put("fishRunStrategy", new FishRunStrategy());
} /**
* 从容器中获取实例:默认为人的策略对象
* @param strategy 策略对象、行为
* @return {@link RunStrategy}
*/
public static RunStrategy getInstance(String strategy){
return RUN_STRATEGY_MAP.getOrDefault(strategy, new PeopleRunStrategy());
} public static Map<String, RunStrategy> getRunStrategyMap(){
return RUN_STRATEGY_MAP;
} /**
* 给容器中注册一个策略实例
* @param runStrategy RunStrategy实现类的对象:不能用Lambda;不能用匿名内部类
*/
public static void registerStrategy(RunStrategy runStrategy){
String strategy = runStrategy.getClass().getSimpleName();
// 将首字母小写并返回结果
strategy = strategy.substring(0, 1).toLowerCase() + strategy.substring(1);
RUN_STRATEGY_MAP.put(strategy, runStrategy);
} /**
* 给容器中注册一个策略实例
* @param runStrategy RunStrategy实现类的对象或行为
*/
public static void registerStrategy(String strategy, RunStrategy runStrategy){
RUN_STRATEGY_MAP.put(strategy, runStrategy);
}
} 运行测试: public static void main(String[] args) {
// 直接获取
RunStrategyFactory.getInstance("fishRunStrategy").run(); // 注册实现类
RunStrategyFactory.registerStrategy(new CarRunStrategy());
// 注册行为
RunStrategyFactory.registerStrategy("snakeRunStrategy",() -> System.out.println("蛇在地上爬")); // 遍历执行
RunStrategyFactory.getRunStrategyMap().forEach((k, v) -> {
System.out.println("Strategy = " + k);
v.run();
});
} 运行结果: 鱼在水里游
Strategy = carRunStrategy
汽车用轮子跑
Strategy = peopleRunStrategy
人用腿跑
Strategy = fishRunStrategy
鱼在水里游
Strategy = snakeRunStrategy
蛇在地上爬

6、 状态设计模式

/**
* Created by Feng on 2020/1/4 11:37<br>
* 抽象状态行为:定义不同状态对应的方法
* 方法的实现由其实现类完成
*/
@FunctionalInterface
interface State {
void handle();
} 具体的状态类: /**
* 具体的状态类:空闲状态
*/
class FreeState implements State { @Override
public void handle() {
System.out.println("闲着就写代码!!");
}
} /**
* 具体的状态类:繁忙状态
*/
class BusyState implements State { @Override
public void handle() {
System.out.println("忙了还得写代码!!!");
}
} 环境类: /**
* 环境类:拥有状态的对象。
* 在环境中维护一个抽象状态类 State 的实例,这个实例定义当前状态。
* 还可以定义初始状态
*/
class Context {
private State state; /**
* 设置状态:调用handle方法
*/
public void setState(State state){
this.state = state;
state.handle();
} public State getState(){
return state;
}
}
/**
* 客户端:测试
*/
public class ContextClient {
public static void main(String[] args) {
Context context = new Context();
context.setState(new FreeState());
context.setState(new BusyState()); context.setState(() -> System.out.println("这是Lambda 状态啊!!!"));
}
}
测试结果: 闲着就写代码!!
忙了还得写代码!!!
这是Lambda 状态啊!!!

ifelse优化方案的更多相关文章

  1. Tomcat 配置详解/优化方案

     转自:http://blog.csdn.net/cicada688/article/details/14451541 Service.xml Server.xml配置文件用于对整个容器进行相关的配置 ...

  2. 一个网站完整详细的SEO优化方案

    根据自己的个人经验完成了这篇文章,希望对SEOer有点帮助,高手直接跳过,请勿喷水... 一个完整的SEO优化方案主要由四个小组组成: 一.前端/页编人员 二.内容编辑人员 三.推广人员 四.数据分析 ...

  3. mysql 性能优化方案

    网 上有不少MySQL 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  4. iOS界面跳转的一些优化方案

    原文地址: http://blog.startry.com/2016/02/14/Think-Of-UIViewController-Switch/ iOS界面跳转的一些优化方案 App应用程序开发, ...

  5. tomcat配置详解/优化方案

    Service.xml Server.xml配置文件用于对整个容器进行相关的配置. <Server>元素:是整个配置文件的根元素.表示整个Catalina容器. 属性:className: ...

  6. mysql 性能优化方案1

    网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  7. (转)Web性能优化方案

    第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢.是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上. 可以跟踪一下我 ...

  8. mysql 性能优化方案 (转)

    网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  9. AngularJS应用页面切换优化方案

    葡萄城的一款尚在研发中的产品,对外名称暂定为X项目.其中使用了已经上市的Wijmo中SpreadJS产品,另外,在研发过程中整理了一些研发总结分享给大家.如本篇的在页面切换的过程中优化方案,欢迎大家跟 ...

  10. AngularJs应用页面切换优化方案(转)

    目录[-] 前言 场景 使用resolve来提前请求数据 为页面加入切换动画 总结 葡萄城的一款尚在研发中的产品,对外名称暂定为X项目.其中使用了已经上市的wijmo中SpreadJS产品,另外,在研 ...

随机推荐

  1. 【封装】Trie

    #include<cstdio> const int N = 1e6 + 5; struct Trie{ int root, id; bool bit[32]; struct Node{ ...

  2. 上传代码到github和删除.git

    在本地建立目录,将想上传的代码放到该文件夹中 git init ###初始化 git add . ###将本地项目工作区的所有文件添加到暂存区 git commit -m "excu&quo ...

  3. mysql的用户管理和权限控制

    1.创建用户用 create user '用户名' @ 'localhost' identified by '密码'; 这串代码是创建当地用,是这台电脑的用户,因为有个localhost: creat ...

  4. Django笔记四十四之Nginx+uWSGI部署Django以及Nginx负载均衡操作

    本文首发于公众号:Hunter后端 原文链接:Django笔记四十四之Nginx+uWSGI部署Django以及Nginx负载均衡操作 这一篇笔记介绍如何使用 Nginx + uWSGI 来部署 Dj ...

  5. erp——绩效考核系统——软件需求规格说明书

    绩效考核系统--软件需求规格说明书 引言 1.1编写目的:此文件需求说明书主要是为了开发人员能了解系统之间的关系,使用者能明白系统的使用方法,另外,可以供一些学习的小白进行参考,提供需要的人参考软件需 ...

  6. LeetCode456:132模式(单调栈)

    解题思路:根据题意,我们首先首先要找到所有的极大值点,同时记录当前极大值点的左边的最小值.遍历所有点,看是否能够满足132条件.虽然记录极大值点的地方可以优化,减小比较的次数,但是由于我们不知道极大值 ...

  7. 华企盾DSC导入离线客户端没有获取到信息

    安装客户端的时候禁用了网卡,导致导入离线客户端获取不到信息. 解决方法: 1.启用网卡,重启电脑 2.启用网卡,重装客户端

  8. 冲刺秋招之牛客刷Java记录第二天

    第一题 下列代码输入什么? public class Test { public static Test t1 = new Test(); { System.out.println("blo ...

  9. vue 2实战系列 —— 复习Vue

    复习Vue 近期需要接手 vue 2的项目,许久未写,语法有些陌生.本篇将较全面复习 vue 2. Tip: 项目是基于 ant-design-vue-pro ant-design-vue-pro 由 ...

  10. Ubuntu 终端如何分割多个窗口

    sudo apt-get install terminator 查看 ~/.config(隐藏文件夹 ctrl + h 即可看见) 下是否有 terminator 文件夹 如果没有手动创建一个 然后在 ...