赞
踩
今天突然想起来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; } }
接下来看下改造后的样子
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);
}
怎么由那么臃肿的代码块 变成如今这么简练的代码块呢,接下来跟我一起看看怎么实现
@FunctionalInterface
public interface LogDynamicSelector<T> {
void apply(Log logAsp, JoinPoint joinPoint, Object obj, HttpServletRequest request);
}
@FunctionalInterface
标明是一个函数接口 然后泛型必须有,我这里因为参数特殊,虽然加了泛型但是没用使用 可以针对于String类或者其他枚举类在进行判断时使用
@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; } }
我这里用过注解方式将这个动态选择器注入到了springBean管理器中,
至于lamada内容表达式就是具体的服务类的方法。
做好这两部 我们的动态选择器基本上就是一个可以使用的一个组件,
将来我们在增加其他日期类型时,可以在这里将日志类型注册到我们的动态选择器中,或者可以自己从springBean中拿出来,将自定义的方法put到map里就可以使用了
@Resource(name = "logDynamicSelectorBean")
private Map<String, LogDynamicSelector> dynamicSelectorBean;
//示例
dynamicSelectorBean.get(logAsp.logType()).apply(logAsp, joinPoint, Obj, request);```
这里通过传入的枚举通过动态选择器获取到对应的执行器,然后进行执行如果需要返回值只需要在定义函数接口时,将返回值类型加上 可以固定 也可以泛型
希望能帮助到大家
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。