唐僧喜欢小龙女

导航

jdk 自带的函数式接口以及自定义函数式接口

1、jdk自带的函数式接口

1.1 Predicate

断定型接口

Predicate 函数式接口特点:Predicate调用test方法的时候传一个参数,返回一个布尔值。

    public static boolean isNullOrEmpty(Map map) {


//        Predicate predicate = new Predicate<Map>() {
//            public boolean test(Map map){
//                if (null == map || 0 == map.size()) {
//                    System.out.println("map 的 size is 0");
//                    return true;
//                } else {
//                    return false;
//                }
//            };
//
//        };
         //这里需要指定范型,这里是Map,指定好了范型后,方法里面才能用Map对象的方法
       Predicate<Map> predicate = (map1)->{
            if (null == map1 || 0 == map1.size()) {
                System.out.println("map 的 size is 0");
                return true;
            } else {
                return false;
            }
        };
        return predicate.test(map);

    }



    Map map = new HashMap();
    //使用predicate方法
    boolean flag1 = LogicUtil.isNullOrEmpty(map);

1.2 Consumer

消费型接口

Consumer 函数式接口特点:传一个参数没有返回值,只是消费

/**
 *
 *  消费型接口 只有输入 没有返回值
 *
 */
public class ConsumerInterfaceDemo {

    private static List strings = new ArrayList();
    public static void main(String[] args) {
        Consumer consumer = new Consumer<List>() {
            @Override
            public void accept(List strings) {
               strings.add("gaohq");
               strings.add("2343");

            }
        };

        consumer.accept(strings);

        //list的forEach方法需要传一个Consumer接口,lambda表达式就返回的是一个Consumer 对象。
        //foreach 方法里面会调用accept方法
//        strings.forEach((str)->{
//            System.out.println(str);
//        });

        strings.forEach(new Consumer<String>() {
            @Override
            public void accept(String  o) {
                System.out.println(o);
            }
        });


        System.out.println("==================");

//        Consumer<Integer> consumer1 = (num1)->{
//            System.out.println(num1);
//
//        };

        Supplier supplier = ()->{return 123;};
        Supplier supplier1 = ()->{return 234;};

        List list = new ArrayList();
        list.add(122);
        list.add(987);

        list.add(supplier.get());
        list.add(supplier1.get());


        list.forEach((num1)->{System.out.println(num1);});
    }
}

 

1.3 Function 

Function 函数式接口特点:Function 接口调用apply的时候需要传一个参数,然后返回另一个值

public class VUtil {
    private final static Logger logger = LoggerFactory.getLogger(VUtil.class);

    public static Function<String, Response> isTrue(String id){

//        Function<String, Response> function = (str)->{
//            Response response = new Response();
//            Message message = new Message();
//            boolean flag = LogicUtil.isDayu2(id);
//            if(flag){
//                message.setCode("0001");
//                message.setMessage(str);
//                response.setMessage(message);
//                response.setStatus(Status.FAIL);
//                logger.error("出现了异常 异常  is {}",str);
//                return response;
//            }else {
//                message.setCode("1000");
//                message.setDescription("rpc调用成功!");
//                User user = new User();
//                user.setAge(18);
//                user.setUsername("gaohq");
//                response.setStatus(Status.SUCCESS);
//                response.setMessage(message);
//                response.setData(user);
//                return response;
//            }
//        };
//        return function;

        Function function = new Function<String, Response>() {
            @Override
            public Response apply(String errormsg) {
                Response response = new Response();
                Message message = new Message();
                boolean flag = LogicUtil.isDayu2(id);
                if(flag){
                    message.setCode("0001");
                    message.setMessage(errormsg);
                    response.setMessage(message);
                    response.setStatus(Status.FAIL);
                    logger.error("出现了异常 异常  is {}",errormsg);
                    return response;
                }else {
                    message.setCode("1000");
                    message.setDescription("rpc调用成功!");
                    User user = new User();
                    user.setAge(18);
                    user.setUsername("gaohq");
                    response.setStatus(Status.SUCCESS);
                    response.setMessage(message);
                    response.setData(user);
                    return response;
                }
            }
        };
        return function;
    };

}

//function 函数构造和调用apply方法
Response response = VUtil.isTrue(id).apply("传的参数不能大于 2");

 

1.4 Supplier

供给型接口

Supplier函数式接口特点:Supplier调用get方法的时候,不需要传参数,就能返回一个值

    public static Boolean getTrue(){
//        Supplier supplier = new Supplier<Boolean>() {
//            @Override
//            public Boolean get() {
//                return true;
//            }
//        };
//        return (boolean) supplier.get();


        Supplier<Boolean> supplier = ()->{
            return true;
        };
        return supplier.get();
    }

   //supplier 接口的调用
   if(LogicUtil.getTrue());
        throw new RuntimeException("ceshi  stderr 的问题");
    }

 1.5 Runnale 

Runable 函数式接口特点:Runable调用run方法的不需要参数没有返回值

2、自定义函数式接口

@FunctionalInterface
public interface BranchHandle {

    /**
     * 分支操作
     *
     * @param trueHandle 为true时要进行的操作
     * @param falseHandle 为false时要进行的操作
     * @return void
     **/
    void trueOrFalseHandle(Runnable trueHandle, Runnable falseHandle);


}



/**
 * 参数为true或false时,分别进行不同的操作
 *
 * @param b
 * @return com.example.demo.func.BranchHandle
 **/
private static BranchHandle isTureOrFalse(boolean b){
    return (trueHandle, falseHandle) -> {
        if (b){
           trueHandle.run();
        } else {
           falseHandle.run();
        }
    };


public static Function<String, Response> getResponse(String id){

    boolean flag = LogicUtil.isDayu2(id);
    Response response = new Response();
    Message message = new Message();
    Function function = new Function<String, Response>() {

        @Override
        public Response apply(String errormsg) {
            BranchHandle branchHandle = isTureOrFalse(flag);
            //这个接口需要传两个runable接口,第一个new了一个Runnable接口重写了run方法。
            //trueOrFalseHandle 这个方法里面需要执行Runnable 的run 方法
            //这样我们自定义的run方法就被执行了。
            branchHandle.trueOrFalseHandle(
            new Runnable() {
                @Override
                public void run() {
                    message.setCode("0001");
                    message.setMessage(errormsg);
                    response.setMessage(message);
                    response.setStatus(Status.FAIL);
                    logger.error("出现了异常 异常  is {}",errormsg);
                }

            },()->{
                message.setCode("1000");
                message.setDescription("rpc调用成功!");
                User user = new User();
                user.setAge(18);
                user.setUsername("gaohq");
                response.setStatus(Status.SUCCESS);
                response.setMessage(message);
                response.setData(user);

            });
            return response;
        }
    };

    return function;
}

 

posted on 2021-11-29 17:16  与时具进&不忘初心  阅读(252)  评论(0编辑  收藏  举报