Java使用Map+函数式接口替换if-else

一、思路说明

        使用Map做一个策略选择,根据不同的判断类型从Map中取出对应的接口进行调用,把用if-else方式写的代码进行替换,属于策略设计模式的一种实现方式

二、开发场景

        在业务开发中经常会看到下很多if-else的代码:

if (type == 1) {
	// 业务1
}
else if (type == 2){
    // 业务2
}
else {
    // 业务3
}

        又或者把上面的if-else换成switch写法,在正常的开发当中是家常便饭的写法了,这种写法会随着判断类型的增多if-else会越写越多导致代码变得臃肿,这样的代码无论在可读性和维护性都变得很差,所以我们需要对这样的代码进行优化,也就是使用本文中提到的Map+函数式接口的方式来实现

三、代码实现

        说明:使用java8提供的lambda表达式,map中的key是判断条件值,value则是函数式接口,本文只是简单写实现的思路代码,重在体现思路给大家作为参考,后续可以根据自己的需求和理解去实现符合自己使用场景的代码

代码示例:

 业务策略类

@Component
public class MapFunctionStrategy {

    @Autowired
    WorkTypeService workTypeService;

    /**
     * 根据不同的业务类型存放对应的函数
     */
    private Map<String, Function<String,String>> workTypeMap=new HashMap<>();

    /**
     * 初始化workTypeMap,这里只是简单演示思路,后续可自行实现一个工厂类来统一管理workTypeMap
     */
    @PostConstruct
    public void initMap (){
        workTypeMap.put("eat", name->workTypeService.eat(name));
        workTypeMap.put("watch", name->workTypeService.watch(name));
        workTypeMap.put("move", name->workTypeService.move(name));
    }

    /**
     * 根据不同的workType获取对应的函数结果
     * @param workType
     * @return
     */
    public String getAction(String workType, String name){
        // 从map中取出对应的函数
        Function<String,String> result=workTypeMap.get(workType);
        if(result!=null){
            // 传入参数执行函数
            return result.apply(name);
        }
        return "不存在业务类型";
    }
}

业务类

@Service
public class WorkTypeService {


    public String eat(String name){
        return "eat:" + name;
    }

    public String watch(String name){
        return "watch:" + name;
    }

    public String move(String name){
        return "move:" + name;
    }

}

四、测试

        测试方法自行实现,我这里简单写了个接口直接调用

五、补充

        如果业务接口调用需要传入多个参数的,则需要自定义函数接口类

/**
 * 自定义参数函数接口(两个输入参数)
 * 默认的Function只能传1个参数
 * @param <A> 参数1
 * @param <B> 参数2
 * @param <R> 结果
 */
@FunctionalInterface
interface Function2<A, B, R>{
    R apply(A a, B b);
}

最后,感谢各位观看,如果有什么疑问和意见欢迎大家留言,我有空就会回复大家,谢谢!

### 使用Java 8特性优化if-else结构 在Java 8中,`Optional` 和 `Lambda` 表达式可以有效减少传统的 `if-else` 结构,使代码更加简洁和可读。以下是几种常见的最佳实践: #### 1. **通过 `Optional` 替代简单的条件判断** 当需要处理可能为空的对象时,可以通过 `Optional` 的方法链来避免显式的 `null` 检查。 ```java public String getName(User user){ return Optional.ofNullable(user) // 创建一个可能为空的 Optional 对象 .map(u -> u.getName()) // 映射到用户的名称属性 .orElse("Unknown"); // 如果不存在,则提供默认值 } ``` 上述代码完全消除了传统 `if-else` 的写法[^2]。如果 `user` 是 `null` 或其 `getName()` 方法返回 `null`,则会自动返回 `"Unknown"` 而不会抛出异常。 --- #### 2. **利用 `Stream` 流操作替代复杂的多分支逻辑** 对于集合类数据的操作,`Stream API` 提供了一种声明式的方式来代替繁琐的循环和嵌套 `if-else` 条件。 假设有一个需求:从一组用户中找到第一个年龄大于等于18岁的用户的名字,如果没有符合条件的用户,则返回 `"No Adult Found"`。 ```java import java.util.List; import java.util.Optional; public class UserFilter { public static String findFirstAdultName(List<User> users) { return users.stream() // 将 List 转换为 Stream .filter(user -> user.getAge() >= 18) // 过滤出成年用户 .map(User::getName) // 获取名字 .findFirst() // 找到第一个匹配项 .orElse("No Adult Found"); // 默认值 } } ``` 这段代码不仅去掉了所有的 `if-else`,还让意图更清晰地表达出来[^1]。 --- #### 3. **使用策略模式函数式接口结合** 有时业务逻辑复杂度较高,无法简单用 `Optional` 解决。此时可以借助 Java 8 中的函数式接口(如 `Function`, `Predicate` 等),配合工厂方法或者构造器引用实现动态行为选择。 例如,定义两个不同的计算方式并根据输入决定执行哪一个: ```java @FunctionalInterface interface Calculator { int compute(int a, int b); } Calculator adder = (a, b) -> a + b; // 加法计算器 Calculator multiplier = (a, b) -> a * b; // 乘法计算器 // 动态选择计算方式 int result = true ? adder.compute(5, 3) : multiplier.compute(5, 3); // 返回加法结果 System.out.println(result); result = false ? adder.compute(5, 3) : multiplier.compute(5, 3); // 返回乘法结果 System.out.println(result); ``` 这种方式实际上隐含了一个三元运算符的行为,但它更容易扩展至更多选项而无需增加额外的 `if-else` 层次[^3]。 --- #### 4. **构造器引用与方法引用的应用场景** 当某些情况下需要根据不同条件实例化不同类型的对象时,也可以考虑使用构造器引用或静态方法引用取代冗长的选择语句。 比如下面的例子展示了如何基于布尔标志创建不同类型的消息处理器: ```java Supplier<MessageHandler> handlerFactory = flag ? EmailMessageHandler::new : SmsMessageHandler::new; MessageHandler handlerInstance = handlerFactory.get(); handlerInstance.send("Hello"); ``` 这里我们省去了手动编写多个 `if` 块来分别初始化两种消息处理器的过程[^4]。 --- ### 总结 以上介绍了四种主要的技术手段用于改进程序设计中的控制流程部分——无论是单层还是深层嵌套形式下的 `if-else` 都能被优雅替换掉。这些技术共同促进了现代软件开发向着更高层次抽象迈进的步伐。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值