java复习第10天---10.1---函数式接口
目录
内容
1、概述
有且仅有一个抽象方法的接口,称为函数式接口。
&emps; 函数式接口,既适用于函数式编程场景的接口。而Java中的函数式编程思想体现为Lambda,所有函数式接口适用于Lambda使用的接口。只有确保接口中有且仅有1个抽象方法,Java中的Lambda才能顺利地进行推导。
-
语法糖:使用更加方便,但是原理不变的代码语法。例如集合变量中的for-each 和迭代器
-
格式
@FunctionalInterface 修饰符 interface 接口名 { public abstract 返回值类型 方法名(参数列表); }
-
解析:
- @FunctionalInterface:用于检测该接口是否为一个函数式接口
2、使用
使用函数式接口有三种形式:
-
创建函数式接口的实现类对象
-
内明内部类
-
Lambda表达式
-
示例2-1:
package feature.jdk8.functionalinterface; @FunctionalInterface public interface MyFunctionalInterface { void method(); } package feature.jdk8.functionalinterface; public class MyFunctionalInterfaceImpl implements MyFunctionalInterface{ @Override public void method() { System.out.println("函数式接口实现类实现抽象方法"); } } package feature.jdk8.functionalinterface; public class TestFunctionalInterface1 { public static void main(String[] args) { // 1、实现类 show(new MyFunctionalInterfaceImpl()); // 2、匿名内部类 show(new MyFunctionalInterface() { @Override public void method() { System.out.println("匿名内部类实现函数式接口抽象方法"); } }); // 3、Lambda表达式 show(() -> System.out.println("Lambda表达式实现函数式接口抽象方法")); } public static void show(MyFunctionalInterface mf) { mf.method(); } } 测试结果: 函数式接口实现类实现抽象方法 匿名内部类实现函数式接口抽象方法 Lambda表达式实现函数式接口抽象方法
3、Lambda表达式优化
3.1、Lambda的延迟执行
有些场景的代码执行后,结果不一定会被使用,从而造成性能浪费。而Lambda表达式是延迟执行的,正好可以作为解决方案,提升性能。
3.2、性能浪费的日志案例(简单)
下面为按级别不同输出不同的日志信息。
-
代码3.2-1:
package feature.jdk8.lambda; public class TestLambdaLog1 { public static void main(String[] args) { String msg1 = "Hello"; String msg2 = " World"; String msg3 = " Java"; log(1, msg1 + msg2 + msg3); log(2, msg1 + msg2 + msg3); } // 根据日志级别不同,显示不同信息 public static void log(int level, String msg) { if(level == 1) { System.out.println(msg); } } }
-
问题分析:无论级别是否满足需求,作为log方法第二个参数,三个字符串都会执行拼接,传入方法内,然后进行级别判断。如果级别不符合要求,那么字符串拼接操作白做了,造成性能浪费。
3.3、Lambda表达式优化
使用Lambda表达式优化上面的日志案例:
-
Lambda特点:延迟加载
-
使用前提:函数式接口
-
函数式接口代码3.3-1:功能实现消息拼接
package feature.jdk8.lambda; @FunctionalInterface public interface MessageBuilder{ String builder(); // 拼接信息 } package feature.jdk8.lambda; public class TestLambdaLog2 { public static void main(String[] args) { String msg1 = "Hello"; String msg2 = " World"; String msg3 = " Java"; log(1, () -> msg1 + msg2 + msg3); } // 根据日志级别不同,显示不同信息 public static void log(int level, MessageBuilder mb) { if(level == 1) { System.out.println(mb.builder()); } } }
-
解析:
- 使用Lambda表达式传递参数,仅仅吧参数传递到log方法中
- 只有满足条件,日志等级是1级
- 才会调用接口的builder方法进行字符串的拼接
- 如果条件不满足,接口的builder方法不会执行,自然不会进行字符串的拼接
后记 :
本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785
前端项目源代码地址:https://gitee.com/gaogzhen/vue-leyou
后端JAVA源代码地址:https://gitee.com/gaogzhen/JAVA