函数式编程
在兼顾面向对象特性的基础上 java语言通过Lambda表达式与方法引用等 为开发者打开了函数式编程的大门
Lambda的延迟执行
有些场景的代码执行后 结果不一定会被使用 从而造成性能浪费 而Lambda表达式是延迟执行的 这正好可以解决方法 提升性能
性能浪费的日志案例
注:日历可以帮助我们快速的定位问题 记录程序运行过程中的情况 以便项目的监控和优化
日志案例:
代码:
public static void showLog(int level,String mess){ if (level==1){ System.out.println(mess); } } public static void main(String[] args) { String mess1="Hello"; String mess2="World"; String mess3="JAVA"; showLog(1,mess1+mess2+mess3); }
发现以上代码存在的一些性能浪费的问题
当我们调用showLog方法 传递的第二个参数是一个拼接后的字符串 先把字符串拼接好了 然后在调用showLog方法 showLog方法中如果传递的日志等级不是1级 那么就不是如此拼接后的字符串 所以感觉字符串就白拼接了 存在了浪费
使用Lambda优化日志案例
Lambda的特点:延迟加载
Lambda的使用前提 必须存在函数式接口
函数式接口:
@FunctionalInterface public interface MessageBuilder { public abstract String builderMessage(); }
类:
public class demo02Logger { public static void showLog(int level, MessageBuilder mb){ if (level==1){ System.out.println(mb.builderMessage()); } } public static void main(String[] args) { String mess1="Hello"; String mess2="World"; String mess3="JAVA"; showLog(1,()->{ return mess1+mess2+mess3; }); } }
使用Lambda表达式做完参数传递 仅仅是把参数传递到showLog方法中
只有满足条件 日志的等级是1级才会调用接口MessageBuilder中的方法builderMessage 才会进行字符串的拼接
如果条件不满足 日志的等级不是1级 那么MessageBuilder中的方法builderMessage 不会执行
所以不存在新能的浪费
测试代码:
public class demo02Logger { public static void showLog(int level, MessageBuilder mb){ if (level==1){ System.out.println(mb.builderMessage()); } } public static void main(String[] args) { String mess1="Hello"; String mess2="World"; String mess3="JAVA"; showLog(2,()->{ System.out.println("程序合理执行"); return mess1+mess2+mess3; }); } }
我们在lambda添加一个输出语句 并将级别改为2级
运行结果:
代码:
public class demo02Logger { public static void showLog(int level, MessageBuilder mb){ if (level==1){ System.out.println(mb.builderMessage()); } } public static void main(String[] args) { String mess1="Hello"; String mess2="World"; String mess3="JAVA"; showLog(1,()->{ System.out.println("程序合理执行"); return mess1+mess2+mess3; }); } }
我们在lambda添加一个输出语句 并将级别改为1级
运行结果:
标签:showLog,String,void,编程,mess1,Lambda,public,延迟 From: https://www.cnblogs.com/shenziyi/p/16798456.html