ifelse优化方案
优化 if else:https://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优化方案的更多相关文章
- Tomcat 配置详解/优化方案
转自:http://blog.csdn.net/cicada688/article/details/14451541 Service.xml Server.xml配置文件用于对整个容器进行相关的配置 ...
- 一个网站完整详细的SEO优化方案
根据自己的个人经验完成了这篇文章,希望对SEOer有点帮助,高手直接跳过,请勿喷水... 一个完整的SEO优化方案主要由四个小组组成: 一.前端/页编人员 二.内容编辑人员 三.推广人员 四.数据分析 ...
- mysql 性能优化方案
网 上有不少MySQL 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...
- iOS界面跳转的一些优化方案
原文地址: http://blog.startry.com/2016/02/14/Think-Of-UIViewController-Switch/ iOS界面跳转的一些优化方案 App应用程序开发, ...
- tomcat配置详解/优化方案
Service.xml Server.xml配置文件用于对整个容器进行相关的配置. <Server>元素:是整个配置文件的根元素.表示整个Catalina容器. 属性:className: ...
- mysql 性能优化方案1
网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...
- (转)Web性能优化方案
第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢.是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上. 可以跟踪一下我 ...
- mysql 性能优化方案 (转)
网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...
- AngularJS应用页面切换优化方案
葡萄城的一款尚在研发中的产品,对外名称暂定为X项目.其中使用了已经上市的Wijmo中SpreadJS产品,另外,在研发过程中整理了一些研发总结分享给大家.如本篇的在页面切换的过程中优化方案,欢迎大家跟 ...
- AngularJs应用页面切换优化方案(转)
目录[-] 前言 场景 使用resolve来提前请求数据 为页面加入切换动画 总结 葡萄城的一款尚在研发中的产品,对外名称暂定为X项目.其中使用了已经上市的wijmo中SpreadJS产品,另外,在研 ...
随机推荐
- 文心一言 VS 讯飞星火 VS chatgpt (148)-- 算法导论12.2 3题
三.用go语言,写出过程 TREE-PREDECESSOR 的伪代码. 文心一言: 以下是使用Go语言编写的TREE-PREDECESSOR函数的伪代码: func TREE-PREDECESSOR( ...
- 使用 Kubernetes 为 CI/CD 流水线打造高效可靠的临时环境
介绍 在不断发展的科技世界中,快速构建高质量的软件至关重要.在真实环境中测试应用程序是及早发现和修复错误的关键.但是,在真实环境中设置 CI/CD 流水线进行测试可能既棘手又昂贵. Kubernete ...
- vertx的学习总结2
一.什么是verticle verticle是vertx的基本单元,其作用就是封装用于处理事件的技术功能单元 (如果不能理解,到后面的实战就可以理解了) 二.写一个verticle 1. 引入依赖( ...
- [ABC263F] Tournament
Problem Statement $2^N$ people, numbered $1$ to $2^N$, will participate in a rock-paper-scissors tou ...
- transformer模型
Transformer由谷歌团队在论文<Attention is All You Need>提出,是基于attention机制的模型,最大的特点就是全部的主体结构均为attention. ...
- MongoDB副本集的搭建和管理(高可用)
使得mongodb具备自动故障转移.高可用.读写分离. 副本集默认情况下读写都只是通过主库,副节点只是备份数据而已,但是可以设置副节点允许读操作,这样就可以做成读写分离. 使用pymongo的时候也可 ...
- python操作mongodb实现读写分离
读写分离 默认情况下,MongoClient 实例将查询发送到副本集的主要成员. 要使用副节点作为查询,以实现读写分离,我们必须更改读取首选项: 读取首选项在模块pymongo.ReadPrefere ...
- 数字孪生和GIS融合为环境保护领域带来的变化
在当今日益关注环境保护和可持续发展的时代,数字孪生和GIS的融合为环境保护领域带来了巨大的变化.数字孪生是一种以3D模型为基础的仿真技术,能够对真实世界进行精确的建模和模拟,而GIS则是一种用于收集. ...
- 使用RFC跳过权限校验的方法
1.业务背景 由于业务流程的复杂性,用户往往只具备部分功能的权限,导致在操作自开发程序时出现权限问题.例如前台限制了用户对销售订单的修改,而自开发功能中又涉及单据修改,此时一味限制权限,则无法正常使用 ...
- jenkins删除构建历史并重置构建序号
系统管理 工具和动作-->脚本命令执行 删除之前,现在已经构建了156次 输入脚本 println(Jenkins.instance.getJobNames()) //查看获取任务名列表//要 ...