函数式接口
函数式接口在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(); }