美文网首页我的程序员修炼日记
Java动手封装一个模仿Switch的工具

Java动手封装一个模仿Switch的工具

作者: 一岁一枯荣啊 | 来源:发表于2019-10-16 11:31 被阅读0次

目的

使用这个工具可以实现switch逻辑,case支持断言函数 。替换掉 大量的else if 或者 switch

java code


import java.util.LinkedList;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * Switch.of("this is data or lambda")
 * .when(lambda predicate) true or false
 * .todo(lambda consumer) run
 * .when(lambda predicate) true or false
 * .todo(lambda consumer) run
 * .defaultTodo(x -> System.out.println("未匹配到"))
 * .done(); //  must ,this function is real match invoke
 * <p>
 * 一个数据源或者一个可以返回数据源的函数,根据不同的断言条件匹配不同的消费函数
 * 无匹配项则执行默认的函数,类似于switch . 替换 == 为 函数式断言条件
 * done(); //  must ,this function is real match invoke
 * </p>
 * 使用这个工具可以实现switch逻辑,case支持断言函数 。替换掉 大量的else if 或者 switch
 */
public class Switch<T> {

    private T data;
    private List<CaseInvoke<T>> caseInvokes = new LinkedList<>();

    private Switch(T data) {
        this.data = data;
    }

    public void appendCaseInvoke(CaseInvoke<T> caseInvoke) {
        caseInvokes.add(caseInvoke);
    }

    public void done() {
        Consumer<T> consumer = caseInvokes.stream().filter(x -> x
            .isDefaultInvoke())
            .findFirst()
            .map(CaseInvoke::getConsumer).get();

        if (data == null) {
            consumer.accept(data);
        }
        boolean match = false;

        List<CaseInvoke<T>> invokes = caseInvokes.stream().filter(x -> !x.isDefaultInvoke())
            .collect(Collectors.toList());

        for (CaseInvoke<T> caseInvoke : invokes) {
            if (caseInvoke.getPredicate().test(data)) {
                caseInvoke.getConsumer().accept(data);
                match = true;
            }
        }

        if (!match) {
            consumer.accept(data);
        }
    }

    public static <T> CaseInvokerPredicateSetter<T> of(T data) {
        Switch<T> tSwitch = new Switch<>(data);
        return new CaseInvokerPredicateSetter<T>(tSwitch);
    }

    public static <T> CaseInvokerPredicateSetter<T> of(Supplier<T> tSupplier) {
        Switch<T> tSwitch = new Switch<>(tSupplier.get());
        return new CaseInvokerPredicateSetter<T>(tSwitch);
    }


    public static class CaseInvokerPredicateSetter<T> {
        private Switch<T> tSwitch;
        private CaseInvoke<T> caseInvoke;


        public CaseInvokerPredicateSetter(Switch<T> tSwitch) {
            this.tSwitch = tSwitch;
            this.caseInvoke = new CaseInvoke<>();
        }


        public CaseInvokerConsumerSetter<T> when(Predicate<T> predicate) {
            this.caseInvoke = new CaseInvoke<>();
            this.caseInvoke.setPredicate(predicate);
            return new CaseInvokerConsumerSetter<>(tSwitch, caseInvoke);
        }


        public Switch<T> defaultTodo(Consumer<T> consumer) {
            CaseInvoke<T> caseInvoke = new CaseInvoke<>();
            caseInvoke.setConsumer(consumer);
            caseInvoke.setDefaultInvoke(true);
            tSwitch.appendCaseInvoke(caseInvoke);
            return tSwitch;
        }
    }


    public static class CaseInvokerConsumerSetter<T> {
        private Switch<T> tSwitch;
        private CaseInvoke<T> caseInvoke;

        public CaseInvokerConsumerSetter(Switch<T> tSwitch, CaseInvoke<T> caseInvoke) {
            this.tSwitch = tSwitch;
            this.caseInvoke = caseInvoke;
        }


        public CaseInvokerPredicateSetter<T> todo(Consumer<T> consumer) {
            caseInvoke.setConsumer(consumer);
            caseInvoke.setDefaultInvoke(false);
            tSwitch.appendCaseInvoke(caseInvoke);
            return new CaseInvokerPredicateSetter<>(tSwitch);
        }


    }


    public static class CaseInvoke<T> {
        private Predicate<T> predicate;
        private Consumer<T> consumer;
        private boolean defaultInvoke;

        public CaseInvoke() {
        }

        public CaseInvoke(Predicate<T> predicate, Consumer<T> consumer) {
            this.predicate = predicate;
            this.consumer = consumer;
        }

        public CaseInvoke(Predicate<T> predicate, Consumer<T> consumer, boolean defaultInvoke) {
            this.predicate = predicate;
            this.consumer = consumer;
            this.defaultInvoke = defaultInvoke;
        }

        public Predicate<T> getPredicate() {
            return predicate;
        }

        public void setPredicate(Predicate<T> predicate) {
            this.predicate = predicate;
        }

        public Consumer<T> getConsumer() {
            return consumer;
        }

        public void setConsumer(Consumer<T> consumer) {
            this.consumer = consumer;
        }

        public boolean isDefaultInvoke() {
            return defaultInvoke;
        }

        public void setDefaultInvoke(boolean defaultInvoke) {
            this.defaultInvoke = defaultInvoke;
        }
    }


    public static void main(String[] args) {

        /**
         * 之前的写法
         */
        switch ("A") {
            case "A":
                System.out.println("A");
                break;
            case "B":
                System.out.println("B");
                break;
            default:
                System.out.println("default");
        }

        /**
         * 现在的写法
         */
        Switch.of("D")
            .when(x -> x.equals("A"))
            .todo(x -> System.out.println("A"))
            .when(x -> x.equals("B"))
            .todo(x -> System.out.println("B"))
            .defaultTodo(x -> System.out.println("未匹配到"))
            .done();

        /**
         * 另外一种书面格式
         */
        Switch.of("D")
            .when(x -> {
                return x.equals("A");
            })
            .todo(x -> {
                System.out.println("A");
            })
            .when(x -> {
                return x.equals("B");
            })
            .todo(x -> {
                System.out.println("B");
            })
            .defaultTodo(x -> {
                System.out.println("未匹配到");
            })
            .done();

        /**
         *demo
         */

        Switch.of(() -> new User("jack"))
            .when(x -> x.getName().equals("jack"))
            .todo(x -> System.out.println("user name is jack"))
            .when(x -> x.getName().equals("tom"))
            .todo(x -> System.out.println("user name is tom"))
            .defaultTodo(x -> System.out.println("Who is he?"))
            .done();

    }

    @Data
    @AllArgsConstructor

    public static class User {
        private String name;

    }
}

相关文章

网友评论

    本文标题:Java动手封装一个模仿Switch的工具

    本文链接:https://www.haomeiwen.com/subject/wwvymctx.html