让java switch支持表达式和多匹配

作者:
淡白
创建时间:
2020-07-22 09:54:19
java Choice

摘要:Choice是一个Java库,提供了支持表达式和多匹配的功能。它能让Java支持类似JS中的函数变量传入的特性。使用Choice库可以根据不同的条件选择执行不同的方法。 使用Choice的例子如下: int a = 1, b = 2, c = 3, d = 4; new Choice(true).add(1L, () -> { System.out.println("这里是1"); }).add(a < b ? c : d > a ? b : c, () -> { System.out.println("这里是2"); }).add(3.0f, () -> { System.out.println("这里是3"); }).add(Color.BLUE, () -> { System.out.println("这里是4"); }).add(() -> { System.out.println("多个匹配"); }, 1, 2, 3, 4, 5, 6, 7, 8, 9).Default(() -> { System.out.println("这里是默认方法"); }).execute(4); 在这个例子中,使用了Lambda表达式来定义不同的方法。然后通过Choice库中的add方法将方法和对应的条件添加到Choice对象中。最后使用execute方法根据给定的条件执行相应的方法。 Choice库的实现是通过定义一个Choice类,并在其中定义了一个Map来保存方法和对应的条件。通过add方法将方法和条件添加到Map中,然后通过execute方法根据给定的条件执行相应的方法。 Choice库的实现代码如下: public interface Function { void run(); } public class Choice { private Map<Object, Function> map; private Function Default; private boolean expression; public Choice() { map = new ConcurrentHashMap(); } public Choice(boolean expression) { this(); this.expression = expression; } public Choice add(Object v, Function function) { if (v != null && function != null) { map.put(v, function); } return this; } public Choice add(Function function, Object... v) { if (function != null) { for (Object iv : v) { if (iv != null) { map.put(iv, function); } } } return this; } public void execute() { // 代码省略... } public void execute(Object v) { // 代码省略... } public Choice Default(Function function) { Default = function; return this; } } 在Choice类中,使用ConcurrentHashMap来保存方法和条件的映射关系。可以通过add方法将方法和条件添加到map中。execute方法用于执行方法,如果没有匹配的条件,则执行默认方法。 总结来说,Choice是一个简单的Java库,用于实现条件选择执行不同的方法。它支持表达式和多匹配的功能,并且使用起来非常方便。

choice

先上地址:Github maven:

<dependency>
    <groupId>cn.p00q.choice</groupId>
    <artifactId>choice</artifactId>
    <version>1.0</version>
</dependency>

让java支持表达式和多匹配的实现. 使用例子:

 int a = 1, b = 2, c = 3, d = 4;
        new Choice(true).add(1L, () -> {
            System.out.println("这里是1");
        }).add(a < b ? c : d > a ? b : c, () -> {
            System.out.println("这里是2");
        }).add(3.0f, () -> {
            System.out.println("这里是3");
        }).add(Color.BLUE, () -> {
            System.out.println("这里是4");
        }).add(() -> {
            System.out.println("多个匹配");
        }, 1, 2, 3, 4, 5, 6, 7, 8, 9).Default(() -> {
            System.out.println("这里是默认方法");
        }).execute(4);

使用了Lambda表达式的特性.不仅能这样用,还能可以这样用: 在A类创建一个公开的静态Choice

public static Choice socketChoice;

在不同的任务类中去实现Function接口的run方法或者直接添加Lambda表达式.即可实现在不同请求调用不同方法的功能.

socketChoice.execute(请求值)

实现

java并不能直接像js那样将函数直接视为变量传入.所以通常以接口(只能有一个方法)当作函数进行传入.

接口定义:

public interface Function {
    /**
     * 运行方法
     */
    void run();

}

完整实现:

public class Choice {
    /**
     * 方法map
     */
    private Map<Object, Function> map;
    /**
     * 默认方法
     */
    private Function Default;
    /**
     * 表达式支持
     */
    private boolean expression;

    public Choice() {
        map = new ConcurrentHashMap();
    }

    public Choice(boolean expression) {
        this();
        this.expression = expression;
    }

    public Choice add(Object v, Function function) {
        if (v != null && function != null) {
            map.put(v, function);
        }
        return this;
    }

    public Choice add(Function function, Object... v) {
        if (function != null) {
            for (Object iv : v) {
                if (iv != null) {
                    map.put(iv, function);
                }
            }
        }
        return this;
    }

    /**
     * 不传值的执行
     */
    public void execute() {
        AtomicBoolean flg = new AtomicBoolean(false);
        //遍历map
        for (Map.Entry<Object, Function> entry : map.entrySet()) {
            Object iv = entry.getKey();
            if (iv != null) {
                Function iFun = entry.getValue();
                //类型判断
                if (expression && iv.getClass().equals(Boolean.class)) {
                    if (iv.equals(true)) {
                        //类型一样eq为true 执行方法
                        iFun.run();
                        flg.set(true);
                        return;
                    }
                }
            }
        }
        if (!flg.get() && Default != null) {
            Default.run();
        }
    }

    /**
     * 传值的执行
     *
     * @param v 匹配值
     */
    public void execute(Object v) {
        if (v == null) {
            return;
        }
        AtomicBoolean flg = new AtomicBoolean(false);
        Function fastTrue = null;
        for (Map.Entry<Object, Function> entry : map.entrySet()) {
            Object iv = entry.getKey();
            Function iFun = entry.getValue();
            //类型判断
            if (v.getClass().equals(iv.getClass())) {
                if (v.equals(iv)) {
                    iFun.run();
                    flg.set(true);
                    return;
                }
            }
            //表达式
            if (expression && iv.getClass().equals(Boolean.class)) {
                if (v.equals(true)) {
                    fastTrue = iFun;
                    flg.set(true);
                }
            }
        }
        if (flg.get()) {
            if (expression && fastTrue != null) {
                fastTrue.run();
            }
        } else if (Default != null) {
            Default.run();
        }
    }

    public Choice Default(Function function) {
        Default = function;
        return this;
    }

}