结合HashMap与Java 8的Function和Optional消除ifelse判断

shigen坚持更新文章的博客写手,记录成长,分享认知,留住感动。个人IP:shigen

在文章的开头我们先从这些场景进入本期的问题:

  1. 业务代码中各种if-else有遇到过吗,有什么好的优化方式;
  2. java8出来这么多年了,Function、Optional有经常用到吗?

可能文字描述还是略显抽象,我们直接上代码:

public class SimplifyIfElse {

    public String handleQuestion(String type, String detail) {
        if ("A".equals(type)) {
            return "call methodA to handle" + detail;
        } else if ("B".equals(type)) {
            return "call methodB to handle" + detail;
        } else if ("C".equals(type)) {
            return "call methodC to handle" + detail;
        } else {
            throw new IllegalArgumentException("invalid type: " + type);
        }
    }
}    

这种代码其实很常见的,使用起来也就是一行调用:

    public static void main(String[] args) {
        assert new SimplifyIfElse().handleQuestion("B", "detail").equals("call methodB to handledetail");
    }

这里直接用的assert进行的断言验证。

但是有没有考虑到一些问题:

  • 这是明显的坏味道的代码,各种判断,看起来很是不舒服;
  • 后期加上同样的逻辑,是不是if-else的体量还会继续增加,维护的成本也在增加。

也许稍微有点经验的同学会想到我用策略模式、工厂方法等等来优化一下这段代码。可以,至少会设计模式的基本使用了,但是对于这样同类型的问题,我们没有必要整的这么复杂。

不管是策略模式还是工厂方法,其底层还是维护的一个hashMap,对应的key和value分别是问题标识和问题的解决方法。

掌握到这个核心,我们来优化下现存的代码:

    private static final HashMap<String, Function<String, String>> QUESTION_HANDLER_MAP = new HashMap<>();

    static {
        QUESTION_HANDLER_MAP.put("A", detail -> "call methodA to handle" + detail);
        QUESTION_HANDLER_MAP.put("B", detail -> "call methodB to handle" + detail);
        QUESTION_HANDLER_MAP.put("C", detail -> "call methodC to handle" + detail);
    }

    public String handleQuestionV2(String type, String detail) {
        return Optional.ofNullable(QUESTION_HANDLER_MAP.get(type).apply(detail)).orElseThrow(() -> new IllegalArgumentException("invalid type: " + type));
    }

这里用到了java8的新特性,Function和Optional,其中:

  • Function是一个功能接口,Function<T,R>中的T和R都是范型,分别表示输入类型和输出类型;
  • Optional这里不再做过多的解释,就是优雅的判空

代码这样改造之后,后期只需要往QUESTION_HANDLER_MAP增添新的元素即可,大大的简化了代码。

当然常见的消除if-else代码的方式还有:

  1. 借助switch-case
  2. 借助枚举抽象
  3. SpringBoot的IOC能力

这里先在此点一下,有时间继续分享。附:代码截图:

本期代码截图

与shigen一起,每天不一样!

<think>好的,我需要回答用户关于如何在Java中简化复杂的if-else结构的问题。首先,用户提到了策略模式,引用中也提到了这一点。我应该先解释策略模式,然后提到其他方法,比如多态、状态模式、Optional类、Map+函数式接口等。每个方法都需要一个具体的例子,最好有代码片段。同时要注意使用中文,并且按照系统级指令中的格式要求,比如数学表达式用$...$,独立公式用$$...$$,不过这个问题可能不太涉及数学公式,可能不需要。然后要生成相关问题,放在最后。还要确保LaTeX语法正确,虽然这里可能用不上。最后,引用部分需要正确标注。用户提供的引用12都是关于减少if-else的,所以需要合理引用到回答中。比如在策略模式部分引用[^1],在讨论代码臃肿时引用[^2]。同时,用户希望回答结构清晰,分步骤解决问题,所以需要分点说明每个方法,每个方法下有解释示例代码。需要检查是否有遗漏的方法,确保覆盖主要的优化策略。例如,可能还有工厂模式、责任链模式、枚举等,但根据引用内容,可能优先使用策略模式、多态、状态模式等。另外,要注意代码示例的正确性,比如Java语法是否正确,是否符合最佳实践。最后生成的相关问题应该减少if-else相关,比如性能影响、适用场景、其他设计模式的比较等。现在开始组织内容,确保每个部分清晰,引用正确,代码示例正确,并自然过渡到相关问题。</think>以下是几种优化Java中复杂if-else结构的实用方法,通过设计模式技术手段提升代码可读性维护性: --- ### 1. 策略模式(Strategy Pattern) 将不同条件分支的逻辑封装到独立的策略类中,通过上下文类动态选择策略。例如,处理订单折扣的场景: ```java // 定义策略接口 interface DiscountStrategy { double applyDiscount(double amount); } // 具体策略类 class NoDiscount implements DiscountStrategy { public double applyDiscount(double amount) { return amount; } } class VipDiscount implements DiscountStrategy { public double applyDiscount(double amount) { return amount * 0.8; } } // 上下文类 class DiscountContext { private DiscountStrategy strategy; public void setStrategy(DiscountStrategy strategy) { this.strategy = strategy; } public double executeStrategy(double amount) { return strategy.applyDiscount(amount); } } ``` 通过策略模式,避免了类似`if (userType == VIP) {...}`的条件判断[^1]。 --- ### 2. 多态继承 利用面向对象的多态特性替代条件分支。例如,不同形状的面积计算: ```java abstract class Shape { abstract double calculateArea(); } class Circle extends Shape { private double radius; public double calculateArea() { return Math.PI * radius * radius; } } class Rectangle extends Shape { private double width, height; public double calculateArea() { return width * height; } } ``` 调用时直接使用`shape.calculateArea()`,无需`if (shape instanceof Circle)`判断。 --- ### 3. 状态模式(State Pattern) 适用于对象状态影响行为的场景。例如,订单状态流转: ```java interface OrderState { void handle(OrderContext context); } class NewState implements OrderState { public void handle(OrderContext context) { // 处理新订单逻辑 context.setState(new PaidState()); } } class PaidState implements OrderState { public void handle(OrderContext context) { // 处理已支付逻辑 } } ``` --- ### 4. 使用Optional避免空检查 Java 8的`Optional`类可简化嵌套的`if (obj != null)`判断: ```java Optional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .ifPresent(System.out::println); ``` --- ### 5. Map+函数式接口 将条件分支映射到函数式接口实现: ```java Map<String, Function<Integer, String>> handlers = new HashMap<>(); handlers.put("A", input -> "处理方案A"); handlers.put("B", input -> "处理方案B"); String result = handlers.get(type).apply(input); ``` --- ### 6. 枚举策略 通过枚举实现策略逻辑集中管理: ```java enum Operation { ADD { public int apply(int a, int b) { return a + b; }}, SUBTRACT { public int apply(int a, int b) { return a - b; }}; public abstract int apply(int a, int b); } ``` --- ### 优化效果对比 | 方法 | 适用场景 | 优势 | |--------------------|-------------------------|-----------------------------| | 策略模式 | 多条件分支且需要动态切换逻辑 | 逻辑隔离,扩展性强 | | 多态继承 | 对象行为差异明显 | 天然支持开闭原则 | | Map+函数式接口 | 简单条件映射 | 代码紧凑,易于维护 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值