如何使用lamdba代替if语句

644 阅读2分钟

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”

根据这个思路,该模式也可以实现一些比较复杂的案例。需要开发者自己去思考。比如嵌套执行,复杂条件判断,复杂执行逻辑,中间对象处理等等。再此不一一举例。 怎么样,很简单吧,你学会了吗?快去试试吧!🤔🤔🤔🤔🤔🤔