1、函数式接口—@FunctionalInterface
好处:高逼格、代码收拢、解藕、统一处理
适用范围:具有共性的接口调用代码
举个栗子:
在我们平时的微服务开发中,调用其他服务的接口,通常要把接口调用部分做异常处理(try catch),或者打印异常日志或者结果日志,并且也有可能做一些统一的调用处理,比如微服务接口熔断等处理,这个时候可以适用函数式接口收拢所有的微服务调用集中处理
2、 使用策略模式消除大篇幅if else
日常开发经常会遇到需要大量的if else判断,然后执行对应的代码,如果业务复杂,可能会十几个或者几十个if else,对于代码的扩展性和可读性有很大影响,而且看起来就很low,所以我们可以用到策略模式来消除大量的if else,并且让代码更具有健壮性
好处:高逼格,代码健壮,扩展性强
3、 当策略模式使用不值得的时候,如果优雅的处理大量if else
上面刚说完使用策略模式消除if else,立马先打脸自己,打脸自己才能成长,这次说一个使用java.util.function.Function jdk1.8 函数接口方式处理大篇幅if else的方式
好处:高逼格、比策略模式看起来简单明了(但是需要了解函数式编程,很简单)
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
public class Test {
/**
* 传统的 if else 解决方法
* 当每个业务逻辑有 3 4 行时,用传统的策略模式不值得,直接的if else又显得不易读
*/
public String doBizService(String order) {
if ("type1".equals(order)) {
return "执行业务逻辑1";
} else if ("type2".equals(order)) {
return "执行业务逻辑2";
}else if ("type3".equals(order)) {
return "执行业务逻辑3";
}else if ("type4".equals(order)) {
return "执行业务逻辑4";
}else if ("type5".equals(order)) {
return "执行业务逻辑5";
}else if ("type6".equals(order)) {
return "执行业务逻辑6";
}else if ("type7".equals(order)) {
return "执行业务逻辑7";
}else if ("type8".equals(order)) {
return "执行业务逻辑8";
}else if ("type9".equals(order)) {
return "执行业务逻辑9";
}
return "不在处理的逻辑中返回业务错误";
}
//---------------------------高逼格分割线------------------------------------
/**
* 业务逻辑分派Map
* Function为函数式接口,
* 下面代码中 Function<String, Object> 的含义是接收一个String类型的变量用来获取你要执行哪个Function,实际使用中可自行定义
* Function执行完成返回一个Object类型的结果,这个结果就是统一的业务处理返回结果,实际使用中可自行定义
*/
private static Map<String, Function<String, Object>> checkResultDispatcher = new HashMap<>();
/**
* 初始化 业务逻辑分派Map 其中value 存放的是 lambda表达式
* 也可以依赖于spring的@PostConstruct 初始化checkResultDispatcher 根据各个技术栈调整
*/
static {
checkResultDispatcher.put("type1", order -> testService.handleTyep1(order));
checkResultDispatcher.put("type2", order -> testService.handleTyep2(order));
checkResultDispatcher.put("type3", order -> testService.handleTyep3(order));
checkResultDispatcher.put("type4", order -> testService.handleTyep4(order));
checkResultDispatcher.put("type5", order -> testService.handleTyep5(order));
checkResultDispatcher.put("type6", order -> testService.handleTyep6(order));
checkResultDispatcher.put("type7", order -> testService.handleTyep7(order));
checkResultDispatcher.put("type8", order -> testService.handleTyep8(order));
checkResultDispatcher.put("type9", order -> testService.handleTyep9(order));
}
public Object handleBizService(String type) {
//从逻辑分派Dispatcher中获得业务逻辑代码,result变量是一段lambda表达式
Function<String, Object> result = checkResultDispatcher.get(type);
if (result != null) {
//执行这段表达式获得String类型的结果
return result.apply(type);
}
return "不在处理的逻辑中返回业务错误";
}
}
补一下关于java.util.function包下面各个类的简单了解
4、使用Java 8及以上版本的特性
Java 8引入了许多新特性,如Lambda表达式、Stream API和Optional类,这些特性可以使你的代码更简洁、易读。
例如,使用Stream API对列表进行操作:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
.filter(name -> name.startsWith("A"))
.forEach(name -> System.out.println(name));
在这一部分中,我们已经介绍了一些基本的Java编程建议。在下一部分,我们将深入讨论如何编写高效的Java代码,如何优化性能以及如何利用设计模式进行更高级的编程。
5、使用设计模式
设计模式是在软件开发中经常出现的问题的通用、重用的解决方案。熟悉和使用它们可以帮助你编写更加结构化、可维护和可扩展的代码。
例如,使用单例模式确保一个类只有一个实例: