if-else的弊病
众所周知,在条件判断多了的代码中,if-else将会破坏程序结构,代码冗长,后续更是难以维护。接下来介绍一种使用lamdba函数和接口代替if-else的方法(其也可以是“策略模式”,“适配器模式”,和“switch-case”的解决方案)。
如何使用java实现
1.定义接口,用于描述if语句体。
public interface Matcher<T, R> {
/**
* 条件匹配 相当于if
*
* @return 判断条件
*/
Predicate<T> match();
/**
* 匹配执行 相当于if中的执行体
*
* @return 值工厂
*/
Function<T, R> executor();
/**
* 工厂方法,快速创建分支
*
* @param match 测试器
* @param executor 执行体
* @param <T> 参数类型
* @param <R> 值类型
* @return 返回一个新的分支
*/
static <T, R> Matcher<T, R> of(Predicate<T> match, Function<T, R> executor) {
return new Matcher<T, R>() {
@Override
public Predicate<T> match() {
return match;
}
@Override
public Function<T, R> executor() {
return executor;
}
};
}
}
2.创建一个简单的执行体模版类,用于模拟if-else。
public class Selector<P, T> {
private boolean selected = false;
private Function<P, T> executor;
/**
* 选择器参数,该参数会在进行条件判断和结果获取时会被当做条件传入
*/
private final P param;
public Selector(P param) {
this.param = param;
}
public Selector<P, T> match(Predicate<P> match, Function<P, T> executor) {
Matcher<P, T> branch = Matcher.of(match, executor);
return match(branch);
}
/**
* 传入一个新的分支,如果这个分支满足条件 则结束
*
* @param branch 则当前选择器将接受当前分支的结果并完成
* @return 选择器自身
*/
public Selector<P, T> match(Matcher<P, T> branch) {
if (!selected) {
boolean pass = branch.match().test(param);
if (pass) {
selected = true;
executor = branch.executor();
}
}
return this;
}
public T end() {
if (selected) {
return executor.apply(param);
}
return null;
}
/**
* 在不想返回null值时
*
* @param elseFunction 默认返回值情况
* @return 返回数据值
*/
public T orElse(Function<P, T> elseFunction) {
if (selected) {
return executor.apply(param);
} else {
return elseFunction.apply(param);
}
}
}
3.接下来模拟一个列子
一个简单的示例,描述了switch-case匹配时的输出值。
String hero = new Selector<String, String>("Fizz")
.match("Caitlyn"::equals, param -> "i'm Caitlyn")
.match("Diana"::equals, param -> "i'm Diana")
.match("Ashe"::equals, param -> "i'm Ashe")
.match("Annie"::equals, param -> "i'm Annie")
.match("Fizz"::equals, param -> "i'm Fizz")
.end();
System.out.println(hero); // “i'm Fizz”
根据这个思路,该模式也可以实现一些比较复杂的案例。需要开发者自己去思考。比如嵌套执行,复杂条件判断,复杂执行逻辑,中间对象处理等等。再此不一一举例。 怎么样,很简单吧,你学会了吗?快去试试吧!🤔🤔🤔🤔🤔🤔