标签:hello java 表达式 运算 过多 带来 ppi init 完整
对于逻辑表达模式固定的 if...else 代码,可以通过某种映射关系,将逻辑表达式用表格的方式表示;再使用表格查找的方式,找到某个输入所对应的处理函数,使用这个处理函数进行运算。
逻辑表达模式固定的 if...else
1 if (param.equals(value1)) { 2 doAction1(someParams); 3 } else if (param.equals(value2)) { 4 doAction2(someParams); 5 } else if (param.equals(value3)) { 6 doAction3(someParams); 7 } 8 // ...
可重构为
1 Map<?, Function<?> action> actionMappings = new HashMap<>(); // 这里泛型 ? 是为方便演示,实际可替换为你需要的类型 2 3 // When init 4 actionMappings.put(value1, (someParams) -> { doAction1(someParams)}); 5 actionMappings.put(value2, (someParams) -> { doAction2(someParams)}); 6 actionMappings.put(value3, (someParams) -> { doAction3(someParams)}); 7 8 // 省略 null 判断 9 actionMappings.get(param).apply(someParams);
介绍
当 if...else 中的条件表达式灵活多变,无法将条件中的数据抽象为表格并用统一的方式进行判断时,这时应将对条件的判断权交给每个功能组件。并用链的形式将这些组件串联起来,形成完整的功能。
适用场景
条件表达式灵活多变,没有统一的形式。
实现与示例
职责链的模式在开源框架的 Filter、Interceptor 功能的实现中可以见到很多。下面看一下通用的使用模式:
重构前:
1 public void handle(request) { 2 if (handlerA.canHandle(request)) { 3 handlerA.handleRequest(request); 4 } else if (handlerB.canHandle(request)) { 5 handlerB.handleRequest(request); 6 } else if (handlerC.canHandle(request)) { 7 handlerC.handleRequest(request); 8 } 9 }
重构后:
1 public void handle(request) { 2 handlerA.handleRequest(request); 3 } 4 5 public abstract class Handler { 6 protected Handler next; 7 public abstract void handleRequest(Request request); 8 public void setNext(Handler next) { this.next = next; } 9 } 10 11 public class HandlerA extends Handler { 12 public void handleRequest(Request request) { 13 if (canHandle(request)) doHandle(request); 14 else if (next != null) next.handleRequest(request); 15 } 16 }
介绍
Java 代码中的一部分 if...else 是由非空检查导致的。因此,降低这部分带来的 if...else 也就能降低整体的 if...else 的个数。
Java 从 8 开始引入了 Optional 类,用于表示可能为空的对象。这个类提供了很多方法,用于相关的操作,可以用于消除 if...else。开源框架 Guava 和 Scala 语言也提供了类似的功能。
使用场景
有较多用于非空判断的 if...else。
实现与示例
传统写法:
1 String str = Hello World!; 2 if (str != null) { 3 System.out.println(str); 4 } else { 5 System.out.println(Null); 6 }
使用 Optional 之后:
1 1 Optional<String> strOptional = Optional.of(Hello World!); 2 2 strOptional.ifPresentOrElse(System.out::println, () -> System.out.println(Null));
标签:hello java 表达式 运算 过多 带来 ppi init 完整
原文地址:https://www.cnblogs.com/yi-yun/p/14694165.html