函数式接口

函数式接口在java中:有且仅有一个抽象方法的接口

 

import java.util.logging.Level;

/*
日志案例
发现以下代码存在性能浪费的问题
调用showlog方法,传递的第二个参数是一个拼接后的字符串
先把这个字符串拼接好,然后电泳sholog方法
showlog方法中如果传递的日志等级不是1级
那么就不会是如此拼接的字符串
所以感觉字符串白拼接,存在浪费


 */
public class Demo01Logger {
    //定义一个根据日志的级别,显示日志信息的方法
    public static void showLog(int level,String message){
        //对日志的等级进行判断,如果是1级别,那么输出日志信息
        if (level==1){
            System.out.println(message);
        }

    }

    public static void main(String[] args) {
        //定义三个日志信息
        String msg1="hello";
        String msg2="World";
        String msg3="java";
        //调用showLog方法,传递日志级别和日志信息
        showLog(1,msg1+msg2+msg3);

    }
}

 

 

 

优化:

/*
使用lambda优化案例
lambda的特点:延迟加载
lambda的使用前提,必须存在函数式接口,

* */
public class demo02Lambda {
    //定义一个显示日志的方法,方法的参数传递日志的等级和Messagebuilder接口
    public static void showLog(int level,MessageBuilder mb){
        //对日志的等级进行判断,如果是1级,则调用MessageBuilder接口中的builderMessager方法
        if(level==1){
            System.out.println(mb.builerMessage());

        }
    }

    public static void main(String[] args) {
        String msg1="hello";
        String msg2="World";
        String msg3="java";
        showLog(1,()->{
            return msg1+msg2+msg3;
        });

        /*

        使用lambda表达式作为参数传递,仅仅是把参数传递到showlog方法中
        只有满足条件,日志的等级是1级
           才会调用接口messageBuilder中的builderMessage
           才会进行字符串的拼接
        如果条件不满足,日志等级不是1级
           那么MessageBuilder接口中的方法builder Message也不会执行
           所以拼接字符串的代码也不会执行
        所以不存在浪费
         */
        showLog(2,()->{
            System.out.println("不满足条件不执行");
            return msg1+msg2+msg3;
        });
    }
}

 

 

@FunctionalInterface
public interface MessageBuilder {
    //定义一个拼接消息的抽象方法,返回被拼接的消息
    public abstract String builerMessage();
}

 

posted @ 2020-10-17 17:26  159566  阅读(81)  评论(0编辑  收藏  举报