鲁迅曾说过,“每解决一个问题,就会因出更多的问题”。我们一起来看看这样的实现有什么好处,会带来什么问题。

好处很直观:

  1. 在一段代码里直观的看到"判断条件"与业务逻辑的映射关系
  2. 不需要单独定义接口与实现类,直接使用现有的函数式接口(什么?不知道函数式接口?快去了解),而实现类直接就是业务代码本身。

不好的点:

  1. 需要团队成员对lambda表达式有所了解(什么?Java14都出来了还有没用上Java8新特性的小伙伴?)

接下来我举几个在业务中经常遇到的if else场景,并用Map+函数式接口的方式来解决它

在真实业务场景问题的解决思路

有的小伙伴会说,我的判断条件有多个啊,而且很复杂,你之前举个例子只有单个判断逻辑,而我有多个判断逻辑该怎么办呢?

很好解决:写一个判断逻辑的方法,Map的key由方法计算出

/**

  • 某个业务服务类
    */
    @Service
    public class BizService {

private Map<String, Function<String, String>> checkResultDispatcherMuti = new HashMap<>();

/**

  • 初始化 业务逻辑分派Map 其中value 存放的是 lambda表达式
    */
    @PostConstruct
    public void checkResultDispatcherMuitInit() {
    checkResultDispatcherMuti.put(“key_订单1”, order -> String.format(“对%s执行业务逻辑1”, order));
    checkResultDispatcherMuti.put(“key_订单1_订单2”, order -> String.format(“对%s执行业务逻辑2”, order));
    checkResultDispatcherMuti.put(“key_订单1_订单2_订单3”, order -> String.format(“对%s执行业务逻辑3”, order));
    }

public String getCheckResultMuti(String order, int level) {
//写一段生成key的逻辑:
String ley = getDispatcherKey(order, level);

Function<String, String> result = checkResultDispatcherMuti.get(ley);
if (result != null) {
//执行这段表达式获得String类型的结果
return result.apply(order);
}
return “不在处理的逻辑中返回业务错误”;
}

/**

  • 判断条件方法
    */
    private String getDispatcherKey(String order, int level) {
    StringBuilder key = new StringBuilder(“key”);
    for (int i = 1; i <= level; i++) {
    key.append(“_” + order + i);
    }
    return key.toString();
    }
    }

用http模拟一下:

/**

  • 模拟一次http调用
    */
    @RestController
    public class BizController {

@Autowired
private BizService bizService;

@PostMapping(“/v1/biz/testMuti”)
public String test1(String order, Integer level) {
return bizService.getCheckResultMuti(order, level);
}
}

只要设计好你的key的生成规则就好。

还有小伙伴会问:我的业务逻辑有很多很多行,在checkResultDispatcherMuitInit()方法的Map中直接写不会很长吗?

直接写当然长了,我们可以抽象出一个service服务专门放业务逻辑,然后在定义中调用它就好了:

提供一个业务逻辑单元:

/**

  • 提供业务逻辑单元
    */
    @Service
    public class BizUnitService {

public String bizOne(String order) {
return order + “各种花式操作1”;
}
public String bizTwo(String order) {
return order + “各种花式操作2”;
}
public String bizThree(String order) {
return order + “各种花式操作3”;
}
}

/**

  • 某个业务服务类
    */
    @Service
    public class BizService {
    @Autowired
    private BizUnitService bizUnitService;

private Map<String, Function<String, String>> checkResultDispatcherComX = new HashMap<>();

/**

  • 初始化 业务逻辑分派Map 其中value 存放的是 lambda表达式
    */
    @PostConstruct
    public void checkResultDispatcherComXInit() {
    checkResultDispatcherComX.put(“key_订单1”, order -> bizUnitService.bizOne(order));
    checkResultDispatcherComX.put(“key_订单1_订单2”, order -> bizUnitService.bizTwo(order));
    checkResultDispatcherComX.put(“key_订单1_订单2_订单3”, order -> bizUnitService.bizThree(order));
    }

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

最后

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

❤️ 谢谢支持,喜欢的话别忘了 关注、点赞哦。

前端校招面试题精编解析大全

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

C大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐