1. switch
switch方法针对枚举值处理有不错的效果,比如针对不同的订单状态时要做不同的处理,因为状态值有限,这时我们就可以直接使用switch来针对不同状态做不同的处理:
原语句
public void before(Integer status) { if(status == 1){ System.out.println("订单未接单"); }else if(status == 2){ System.out.println("订单未发货"); }else if(status == 3){ System.out.println("订单未签收"); }else{ System.out.println("订单已签收"); } }
switch
public void greater(Integer status) { switch (status){ case 1: System.out.println("订单未接单"); break; case 2: System.out.println("订单未发货"); break; case 3: System.out.println("订单未签收"); break; default: System.out.println("订单已签收"); } }
总结:
switch语句适用于判断条件有限且不需要经过复杂的计算,处理语句简单的场景。如果我们的判断条件需要经过一系列复杂的计算才能得到,或者处理语句逻辑也比较复杂时,我们就要考虑其他的处理方式了,毕竟在case中书写一大堆处理语句并不算得让人舒适的事情
2. 函数式接口
针对比较复杂的处理逻辑时,我们偏向于将这些处理逻辑单独抽离出来,而不是还放在一个方法里处理,增加整体的可读性和解耦性,也是我们衍生出利用函数式接口来处理if else的模式
函数式接口map处理if else的要义,是将各个条件的复杂处理逻辑单独抽取为一个函数式接口方法,通过统一的判断条件来调用不同的方法,具体示例如下
@Component public class FunctionInterfaceStrategy { /** * key 方法参数,多个参数可以自定义一个实体类处理 * value 方法返回值 */ private Map<Integer, Function<Object,Boolean>> operationMap; @PostConstruct private void init(){ operationMap = new HashMap<>(); operationMap.put(1,this::takeOrder); operationMap.put(2,this::sendOrder); operationMap.put(3,this::signOrder); operationMap.put(4,this::finishOrder); } public Boolean doOperation(Object params,Integer status){ return operationMap.get(status) == null || operationMap.get(status).apply(params); } private Boolean takeOrder(Object params){ // TODO 比较复杂的处理逻辑 System.out.println("订单未接单"); return true; } private Boolean sendOrder(Object params){ // TODO 比较复杂的处理逻辑 System.out.println("订单未发货"); return true; } private Boolean signOrder(Object params){ // TODO 比较复杂的处理逻辑 System.out.println("订单未签收"); return true; } private Boolean finishOrder(Object params){ // TODO 比较复杂的处理逻辑 System.out.println("订单已签收"); return true; } }
调用时就不用再用if else区分了,直接传入参数到function map中调用
@Autowired private FunctionInterfaceStrategy functionInterfaceStrategy; functionInterfaceStrategy.doOperation("参数",1);
当然我们上述演示的是有参数有返回值的函数式接口,实际生产中我们可能还需要其他形式的函数式接口,我们将其单独罗列出来,供大家参考使用
接口名称 | 说明 | 调用方法 |
---|---|---|
Supplier | 无参数,有返回值 | get |
Consumer | 有参数,无返回值 | accept |
Runnable | 无参数,无返回值 | run |
Function | 有参数,有返回值 | apply |
3. 策略模式
上述的函数式接口的形式,实际上是针对方法进行了分离,所有的实现方法还是放在了一个类里,即使你可以在FunctionInterfaceStrategy类中通过依赖注入的形式再次调用其他类的方法,但是这样的模式,已经趋近于我们要将的下一种方法,即使用策略模式来解决 if else
策略模式的形式适用于实现方法更加复杂的情况,需要将处理逻辑解耦的更加干净的场景
1、首先我们需要创建一个接口类,用来规定我们后续的实现类的格式
public interface OrderStrategy { /** * 获取实现类标识 * @return */ Integer getType(); /** * 逻辑处理 * @param params * @return */ Boolean handler(Object params); }
2、其次针对每个判断条件创建一个实现类
@Service public class SendOrderStrategy implements OrderStrategy{ @Override public Integer getType() { return 2; } @Override public Boolean handler(Object params) { // TODO 复杂的处理逻辑 System.out.println("订单未发货"); return true; } } @Service public class SignOrderStrategy implements OrderStrategy{ @Override public Integer getType() { return 3; } @Override public Boolean handler(Object params) { // TODO 复杂的处理逻辑 System.out.println("订单未签收"); return true; } } @Service public class TakeOrderStrategy implements OrderStrategy{ @Override public Integer getType() { return 1; } @Override public Boolean handler(Object params) { // TODO 复杂的处理逻辑 System.out.println("订单未接单"); return true; } }
3、创建一个策略工厂类,承装实现类
@Component @AllArgsConstructor public class OrderStrategyFactory { private final List<OrderStrategy> orderStrategyList; private static Map<Integer,OrderStrategy> strategyMap = new HashMap<>(); @PostConstruct private void init(){ for (OrderStrategy orderStrategy : orderStrategyList) { strategyMap.put(orderStrategy.getType(),orderStrategy); } } /** * 执行方法 * @param status * @param params * @return */ public Boolean handler(Integer status,Object params){ return strategyMap.get(status).handler(params); } }
4、方法调用
@RestController @RequestMapping("ifelse") @AllArgsConstructor public class IfElseController { private final OrderStrategyFactory orderStrategyFactory; @GetMapping("strategy") public Boolean strategy(Integer status){ return orderStrategyFactory.handler(status,"1"); } }
总结:
通过上述的代码示例,大家其实可以发现,函数式接口和策略模式有异曲同工之处,根本区别在于是否需要将实现方法单独抽取为一个实现类。抽取的粒度越细也就说明解耦越强
使用策略模式,后续如果需要增加if else条件的话,只需要增加实现类即可,针对后续的处理更加方便
最终使用哪一个还需要根据具体的业务情况而定
4. 卫语句
我们经常需要在方法前处理各种参数嵌套判断逻辑,如果不满足条件就直接返回了,这种情况更加推荐使用卫语句来处理
原语句
public void before(Integer status) { if(status != null) { if(status != 0){ if(status == 1){ System.out.println("订单未接单"); } } } }
卫语句
public void greater(Integer status) { if(status == null){ return; } if(status != 0){ return; } if(status == 1){ System.out.println("订单未接单"); } }
以上是Java怎么优雅地书写if-else的详细内容。更多信息请关注PHP中文网其他相关文章!

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Dreamweaver Mac版
视觉化网页开发工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。