今日内容
- 函数式接口
- 函数式编程
- 常见函数式接口
Lambda表达式
JDK1.8的新特性.
- 语法糖:使用更加方便,但原理不变.foreach和迭代器.
- Lambda和匿名内部类不同,匿名内部类会产生类型(可以产生.class文件),而Lambda不会产生类型.
所以Lambda不是匿名内部类的语法糖!!!
Lambda格式:
- () -> {}
- 一些参数 一个指向 一段代码
使用Lambda的前提
Lambda只能操作函数式接口
Lambda省略规则
可推导,可省略 1.()中参数类型可以省略 2.()参数唯一,()可以省略 3.{}内语句唯一,{}可以省略.
函数式接口
- 有且仅有一个抽象方法
- 注解:@FunctionalInterface
函数式编程
Lambda的延迟执行
- 解决方法调用时,字符串参数无论方法内逻辑是否成立,都会先进行拼接的浪费问题.
- Lambda的延迟执行并不是Lambda自身的优点,延迟执行的效果是根据接口进行实现的.
即:满足效果才会调用接口的方法
函数式接口作为方法的参数
new Thread( ()->{sout("嘿嘿嘿")} ).start();
函数式接口作为方法的返回值
直接Returm一个Lambda表达式.
- public Comparator<String> getComparator(){ return ()->{}; }
常用的函数式接口
生产型接口()
- Supplier接口
<T> get(); - 用来产生数据,带有返回值的.
消费型接口
- Consumer接口
1.抽象方法:void accept(T t);
2.默认方法:Consumer<T> andThen(Consumer<? super T> after)如果一个方法的参数和返回值都是Consumer类型,消费一个数据的时候,首先做一个操作,然后再做一个操作,实现组合.
- 不生产数据,只使用数据.
消费数据就是使用数据
判断(筛选)型接口
- Predicate接
1.抽象方法:boolean test(T t)
2.默认方法:- and
- or
- nagate (取反)
- 需要对某种类型数据进行判断,从而得到一个boolean值.
转换型接口
- Function接口
1.抽象方法: R apply(T t);根据类型T的参数获取类型R的结果。
2.默认方法:andThen()用来进行组合操作
- 根据一个数据类型得到另一个数据类型,前者是前置条件,后者是后置条件.