当前位置:   article > 正文

java1.8的函数接口代替if-esle_java 替换if else

java 替换if else

函数式接口

今天突然想起来java的函数接口想用用试试,结果搜了些文章发现都写得不是很完善,对于小白来说很不友好,今天沉浸式函数接口,一起来成长!!
一、 什么是函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是 可以有多个非抽象方法的接口。

二、 函数式接口作用是什么?
适用场景:主要用于函数式编程(即使用lambda表达式编程),函数式接口可以使用于lambda进行参数定义。

示例

今天了解其中一个用法,使用 函数接口 代替代码中丑陋的if-else
先来看下之前的样子

   protected void handleLog(final JoinPoint joinPoint, Log logAsp, final Exception e, Object Obj) {

            switch (logAsp.logType()) {
                case COMMON_LOG:
                    //普通日志
                    custLogService.logCommonInfo(logAsp, joinPoint, Obj);
                    break;
                case INTERFACE_MESSAGE:
                    //接口报文
                    custLogService.logInterfaceMessage(logAsp, joinPoint, Obj);
                    break;
                case DATA_MODIFY:
                    //数据修改
                    custLogService.logDataModify();
                    break;
                case USER_OPERATION:
                    //用户操作
                    break;
                case LOG_FILE:
                    //日志文件
                    break;
                default:
                    break;
            }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

接下来看下改造后的样子

protected void handleLog(final JoinPoint joinPoint, Log logAsp, final Exception e, Object Obj) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        //交由动态选择器选择对应日志类型
        dynamicSelectorBean.get(logAsp.logType()).apply(logAsp, joinPoint, Obj, request);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

怎么由那么臃肿的代码块 变成如今这么简练的代码块呢,接下来跟我一起看看怎么实现

实现过程

首先创建一个函数接口

@FunctionalInterface
public interface LogDynamicSelector<T> {
    void apply(Log logAsp, JoinPoint joinPoint, Object obj, HttpServletRequest request);
}
  • 1
  • 2
  • 3
  • 4

@FunctionalInterface
标明是一个函数接口 然后泛型必须有,我这里因为参数特殊,虽然加了泛型但是没用使用 可以针对于String类或者其他枚举类在进行判断时使用

然后创建一个配置类将我们的接口与Service关联起来,这边我就叫他“动态选择器”

@Order(10)
@Configuration
public class LogDynamicSelectorConfig {
    @Autowired
    private CustLogService logService;

    @Bean("logDynamicSelectorBean")
    public Map<LogTypeEnum, LogDynamicSelector> dynamicSelectorBean() {
        //存储器
        Map<LogTypeEnum, LogDynamicSelector> hashMap = new HashMap(2);
        //普通日志
        hashMap.put(COMMON_LOG, (logAsp, joinPoint, obj, request) -> logService.logCommonInfo(logAsp, joinPoint, obj, request));
        //接口日志
        hashMap.put(INTERFACE_MESSAGE, (logAsp, joinPoint, obj, request) -> logService.logInterfaceMessage(logAsp, joinPoint, obj));
        //...日志
        return hashMap;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

我这里用过注解方式将这个动态选择器注入到了springBean管理器中,
至于lamada内容表达式就是具体的服务类的方法。
做好这两部 我们的动态选择器基本上就是一个可以使用的一个组件,
将来我们在增加其他日期类型时,可以在这里将日志类型注册到我们的动态选择器中,或者可以自己从springBean中拿出来,将自定义的方法put到map里就可以使用了

使用

    @Resource(name = "logDynamicSelectorBean")
    private Map<String, LogDynamicSelector> dynamicSelectorBean;
    //示例
 dynamicSelectorBean.get(logAsp.logType()).apply(logAsp, joinPoint, Obj, request);```
  • 1
  • 2
  • 3
  • 4

这里通过传入的枚举通过动态选择器获取到对应的执行器,然后进行执行如果需要返回值只需要在定义函数接口时,将返回值类型加上 可以固定 也可以泛型

希望能帮助到大家

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号