主要内容
- 自定义函数式接口
- 函数式编程
- 常用函数式接口
1 函数式接口:JDK8新特性
- 有且仅有一个抽象方法的接口
(默认方法, 静态方法, 私有方法, 与 java.lang.Object 类中定义相同的抽象方法, 都不算作抽象方法)- 语法糖:是指更加方便,但底层原理不变的代码语法。
- Lambda和匿名内部类不同,匿名内部类会产生类型(.class文件),而Lambda不产生类型,所以Lambda不是匿名内部类的语法糖
- @FuncationalInterface注解
在接口上使用, 检测当前的接口是否为函数式接口
2 函数式编程
2.1 Lambda的延迟执行
- 解决调用方法时,字符串参数无论方法内裸机是否成立,都会进行拼接的资源浪费
- Lambda延迟的效果是根据接口进行实现的,满足效果才会调用接口的方法
2.2 使用Lambda作为参数和返回值
1.作为参数 new Thread(()->[sout("线程执行了")}).start(); 2.作为返回值 return (a,b)->a-b;
3 常用函数式接口
3.1 Supplier接口
生产型接口
获取值 a和b的和, 获取数组最大值, 获取一个Person对象
T get()用于获取一个对象或值. 至于获取什么值, 怎么获取, 需要我们根据应用场景编写Lambda来实现
3.2 Consumer接口
消费型接口
使用值 给它一个String让他打印, 给它一个对象
1.抽象方法:void accept(T t):用于消费(使用)一个对象或值. 至于怎么消费, 要我们根据应用场景编写Lambda实现 2.默认方法:andThen 拼接两个Consumer接口的Lambda对象实现连续操作. 谁写前面, 谁先消费 default Consumer<T> andThen(Consumer<? super T> after):
3.3 Predicate接口
判断型接口
判断值 判断字符串长度是否大于5
1.抽象方法:boolean test(T t) 用于条件判断 2.默认方法 and:相当于"&&"效果 or:相当于"||"效果 negate:相当于"!"效果
3.4 Function接口
转换型接口
转换值 给它一个String转换为Integer “123”->123
1.抽象方法:R apply(T t) 根据T类型的数据转换为R类型的数据 2.默认方法:andThen() 拼接多个Function转换
- 根据一个数据类型得到另一个数据类型,前者是前置条件,后者是后置条件