企业网站管理系统教程:哪些学校提供网络设计课程?
摘要:企业网站管理系统教程,网络设计有哪些学校,网站建设汕头,会展设计是干什么的引言 最近在使用函数式编程时,突然有了一点心得体会,简单说,用好了函数式编程
企业网站管理系统教程,网络设计有哪些学校,网站建设汕头,会展设计是干什么的引言
最近在使用函数式编程时#xff0c;突然有了一点心得体会#xff0c;简单说#xff0c;用好了函数式编程#xff0c;可以极大的实现方法调用的解耦#xff0c;业务逻辑高度内聚#xff0c;同时减少不必要的分支语句#xff08;if-else#xff09;。
一、函数式编…引言
最近在使用函数式编程时突然有了一点心得体会简单说用好了函数式编程可以极大的实现方法调用的解耦业务逻辑高度内聚同时减少不必要的分支语句if-else。
一、函数式编程就是Lambda表达式吗
Java语言早在 JDK8 就提供了函数式编程的基础。
你可能会问函数编程不就是lambda表达式吗
的确大多数开发可能还停留在 lambda 表达式的使用层面但请注意我从标题、文章开篇都在强调“函数式编程”很明显我有意区别函数式编程和lambda表达式两者的概念。
Java 8 引入的函数式编程到底是什么最近我在开发过程中遇到了一个场景才让我解开了这个困扰我的问题。
二、一个小场景——多路调用
我遇到的场景其实并不复杂或者说我们每天都在写如此场景我甚至并不知道这么简单的场景有没有相应的专有名词来表示就暂将其称为“多路调用场景”。让我们简单模拟一下。 场景描述 A Service 和 B Service 都依赖 CService。 A 和 B都用到了 C的一个方法 doProcess()但 doProcess() 在处理 A 和 B的请求时又需要拿到 A 或 B 的业务数据。 该如何实现 doProcess() 方法 AllArgsConstructor
class AService {private CService cService;public void processData() {ListObject all this.getAll();cService.doProcess(all);}private ListObject getAll() {return Collections.emptyList();}
}AllArgsConstructor
class BService {private CService cService;public void processData() {ListObject data this.queryBDatas();cService.doProcess(data);}private ListObject queryBDatas() {return new ArrayList();}
}class CService {public void doProcess(ListObject busiData) {// 执行C自己的处理逻辑...busiData.stream().forEach(d - {System.out.println(d);});}
}/*** 测试代码*/
public class Test {public static void main(String[] args) {// 实例化服务对象CService cService new CService();AService aService new AService(cService);BService bService new BService(cService);// A - C 处理请求aService.processData();// B - C 处理请求bService.processData();}
}如上代码所示 A、B 的processData 方法都调用C的doProcess 方法他们都将 doProcess 所需的数据通过参数传递过去。这种实现方式虽然可以成功的适配不同的调用者但是数据的生成是在调用 doProcess 前一旦doProcess执行了一些校验逻辑而无法用到这些已经准备好的数据就可能白白浪费查询资源。
另一种实现是通过循环依赖将A或B的实例反过来也注入到 C 服务中在 doProcess 中需要用到A 或 B 的数据时才去查询。这种实现方式虽然可以实现懒加载但又引入了另一个问题就是高耦合性而且依然需要通过 if-else 判断具体是要执行 A.getAll 还是需要执行 B.queryList代码冗杂不说扩展性也很糟糕。
当然上述代码只是个模型实际业务可能比这还要复杂。那到底有没有一种既可以实现懒加载又高度内聚不需要循环依赖的实现方式呢
三、授人以鱼不如授人以渔
请原谅我起了一个这么哗众取宠的小节标题我后面会解释。
