优化if-else代码的八种方案

前言

优化方案一：提前return，去除不必要的else

```if(condition){

//doSomething

}else{

return ;

}
```

```if（!condition）{

return ;

}

//doSomething
```

优化方案二：使用条件三目运算符

```int  price ;

if(condition){

price = 80;

}else{

price = 100;

}
```

```int price = condition?80:100;
```

优化方案三：使用枚举

```String OrderStatusDes;

if(orderStatus==0){

OrderStatusDes ="订单未支付";

}else if(OrderStatus==1){

OrderStatusDes ="订单已支付";

}else if(OrderStatus==2){

OrderStatusDes ="已发货";

}

...
```

```：

public enum OrderStatusEnum {

UN_PAID(0,"订单未支付"),PAIDED(1,"订单已支付"),SENDED(2,"已发货"),;

private int index;

private String desc;

public int getIndex() {

return index;

}

public String getDesc() {

return desc;

}

OrderStatusEnum(int index, String desc){

this.index = index;

this.desc =desc;

}

OrderStatusEnum of(int orderStatus) {

for (OrderStatusEnum temp : OrderStatusEnum.values()) {

if (temp.getIndex() == orderStatus) {

return temp;

}

}

return null;

}

}
```

```String OrderStatusDes = OrderStatusEnum.0f(orderStatus).getDesc();
```

优化方案四：合并条件表达式

``` double getVipDiscount() {

if(age<18){

return 0.8;

}

if("深圳".equals(city)){

return 0.8;

}

if(isStudent){

return 0.8;

}

//do somethig

}
```

``` double getVipDiscount(){

if(age<18|| "深圳".equals(city)||isStudent){

return 0.8;

}

//doSomthing

}
```

优化方案五：使用 Optional

```String str = "jay@huaxiao";

if (str != null) {

System.out.println(str);

} else {

System.out.println("Null");

}
```

```Optional<String> strOptional = Optional.of("jay@huaxiao");

strOptional.ifPresentOrElse(System.out::println, () -> System.out.println("Null"));
```

优化方案六：表驱动法

```if (param.equals(value1)) {

doAction1(someParams);

} else if (param.equals(value2)) {

doAction2(someParams);

} else if (param.equals(value3)) {

doAction3(someParams);

}

// ...
```

```Map<?, Function<?> action> actionMappings = new HashMap<>(); // 这里泛型 ? 是为方便演示，实际可替换为你需要的类型

// 初始化

actionMappings.put(value1, (someParams) -> { doAction1(someParams)});

actionMappings.put(value2, (someParams) -> { doAction2(someParams)});

actionMappings.put(value3, (someParams) -> { doAction3(someParams)});

// 省略多余逻辑语句

actionMappings.get(param).apply(someParams);
```

优化方案七：优化逻辑结构，让正常流程走主干

```public double getAdjustedCapital(){

if(_capital <= 0.0 ){

return 0.0;

}

if(_intRate > 0 && _duration >0){

}

return 0.0;

}
```

```public double getAdjustedCapital(){

if(_capital <= 0.0 ){

return 0.0;

}

if(_intRate <= 0 || _duration <= 0){

return 0.0;

}

}
```

优化方案八：策略模式+工厂方法消除if else

``` String medalType = "guest";

if ("guest".equals(medalType)) {

System.out.println("嘉宾勋章");

} else if ("vip".equals(medalType)) {

System.out.println("会员勋章");

} else if ("guard".equals(medalType)) {

System.out.println("展示守护勋章");

}

...
```

```//勋章接口

public interface IMedalService {

void showMedal();

String getMedalType();

}
```

```//守护勋章策略实现类

public class GuardMedalServiceImpl implements IMedalService {

@Override

public void showMedal() {

System.out.println("展示守护勋章");

}

@Override

public String getMedalType() {

return "guard";

}

}

//嘉宾勋章策略实现类

public class GuestMedalServiceImpl implements IMedalService {

@Override

public void showMedal() {

System.out.println("嘉宾勋章");

}

@Override

public String getMedalType() {

return "guest";

}

}

//VIP勋章策略实现类

public class VipMedalServiceImpl implements IMedalService {

@Override

public void showMedal() {

System.out.println("会员勋章");

}

@Override

public String getMedalType() {

return "vip";

}

}
```

```//勋章服务工产类

public class MedalServicesFactory {

private static final Map<String, IMedalService> map = new HashMap<>();

static {

map.put("guard", new GuardMedalServiceImpl());

map.put("vip", new VipMedalServiceImpl());

map.put("guest", new GuestMedalServiceImpl());

}

public static IMedalService getMedalService(String medalType) {

return map.get(medalType);

}

}
```

```public class Test {

public static void main(String[] args) {

String medalType = "guest";

IMedalService medalService = MedalServicesFactory.getMedalService(medalType);

medalService.showMedal();

}

}
```

参考与感谢

0 条评论

• 日常工作中最容易犯的几个并发错误

列举大家平时在工作中最容易犯的几个并发错误，都是在实际项目代码中看到的鲜活例子，希望对大家有帮助。

• 程序员必备基础：Git 命令全方位学习

掌握Git命令是每位程序员必备的基础，之前一直是用smartGit工具，直到看到大佬们都是在用Git命令操作的，回想一下，发现有些Git命令我都忘记了，于是写了...

• 回归Java基础：触发类加载的六大时机

什么情况下会触发类加载的进行呢？本文将结合代码demo谈谈几种情况，希望对大家有帮助。

• 优化if-else代码的八种方案！

代码中如果if-else比较多，阅读起来比较困难，维护起来也比较困难，很容易出bug，接下来，本文将介绍优化if-else代码的八种方案。

• 8种优化if-else代码的方案请拿走

代码中如果if-else比较多，阅读起来比较困难，维护起来也比较困难，很容易出bug，接下来，本文将介绍优化if-else代码的八种方案。

• android 一些常用的功能方法代码块

我们这些苦逼的程序员在工作中，每一个老板都希望我们都能把手头的工作做好的，而且是越快越好，那我们要怎么样才能快起来呢？对于开发中常用的代码块无限复做是我们工作...

• 【小家Spring】Sping AOP中使用到的那些工具类盘点：AopUtils、AopConfigUtils、AspectJAopUtils 、AopProxyUtils、AopContext

Spring AOP框架的代码结构组织得不可为不好，良好的面向对象的编程思想，其中很有一部分得益于它对代码的结构的把控。良好的封装、分层、隔离。而在其中起到重要...

• [Redis] 分布式缓存中间件 Redis 之 分布式锁实战

环境准备Redis 如何实现分布式锁线程不安全单机锁分布式锁代码实现Redisson 集成和源码分析Redisson 集成源码分析 `RedissonLock`...

• Dubbo源码之代理对象

提供端和消费端都需要生成代理对象，默认通过 JavassistProxyFactory