5. 函数式接口
5.1 概述
只有一个抽象方法的接口我们称之为函数接口。
比如filter、map等方法的参数类型(都是函数式接口,都是只有一个抽象方法),jdk8之后接口有抽象方法和非抽象方法(默认方法 )
JDK的函数式接口都加上了**@FunctionalInterface** 注解进行标识。但是无论是否加上该注解只要接口中只有一个抽象方法,都是函数式接口。
5.2 常见函数式接口
-
Consumer 消费接口
根据其中抽象方法的参数列表和返回值类型知道,我们可以在方法中对传入的参数进行消费。
- Function 计算转换接口
根据其中抽象方法的参数列表和返回值类型知道,我们可以在方法中对传入的参数计算或转换,把结果返回
- Predicate 判断接口
根据其中抽象方法的参数列表和返回值类型知道,我们可以在方法中对传入的参数条件判断,返回判断结果
- Supplier 生产型接口
根据其中抽象方法的参数列表和返回值类型知道,我们可以在方法中创建对象,把创建好的对象返回
5.3 常用的默认方法
and
我们在使用Predicate接口时候可能需要进行判断条件的拼接。而and方法相当于是使用&&来拼接两个判断条件
例如:
打印作家中年龄大于17并且姓名的长度大于1的作家。
这里用两个参数(两个判断条件)来调用and方法
这里的and的拼接判断 if (predicate01.and(predicate02).test(i)){ } 暂时没理解透,
01调用and方法,把02作为参数传进去,但是and方法里面,根据源码,像是两个参数都调用了test进行判断了,后面再调用test来判断参数i是否符合条件,看i是否符合01和02的判断条件,有点绕。
暂时的理解是这样的(01的(value%2==0)&& 02的(value>4)&& value的值为 i )
不过这个理解估计不对,暂时不钻牛角尖。
or
我们在使用Predicate接口时候可能需要进行判断条件的拼接。而or方法相当于是使用||来拼接两个判断条件。
例如:
打印作家中年龄大于17或者姓名的长度小于2的作家。
很简单,就用or而已
negate
Predicate接口中的方法。negate方法相当于是在判断添加前面加了个! 表示取反
例如:
打印作家中年龄不大于17的作家。
.negate() 是在这个 Predicate对象后面 .negate() 的
两种方式