我正在参加「掘金·启航计划」
1. 概述
这是我参加掘金启航计划的第五篇文章,希望观众老爷们多多支持,并在评论区批评指正!
学习函数式接口将会进一步的帮助我们理解学习 Java8 Stream 流编程,也会让我们的代码更加具有通用性。
什么是函数式接口?
当方法的参数是一个抽象方法的接口时,我们称之为函数接口。JDK 的函数式接口都加上了 @FunctionalInterface 注解进行标识。但是无论是否加上该注解只要接口中只有一个抽象方法,都是函数式接口。之前我们在 lambda 表达式和 Optional 讲述中都大量使用了函数式接口。
@FunctionalInterface 注解的作用:
- 当我们创建了一个函数式接口时,在该接口上标注该注解,该接口必须添加一个抽象方法,且只能为一个。
注意: Java8 中的默认方法,不计入。
2. 常见的函数式接口
Java 中的所有函数式接口存放在 java.util.function 包下:
Consumer:消费接口
Function计算转换接口,根据其中的抽象方法的参数列表和返回值类型知道,我们可以在方法中对传入的参数计算或转换,把结果返回。
Predicate判断接口:根据其中抽象方法的参数列表和返回值类型知道,我们可以在方法中对传入的参数条件判断,返回判断结果。
Supplier生产型接口:根据其中抽象方法的参数列表和返回值类型知道,我们可以在方法中创建对象,把创建好的对象返回。
3. 函数式接口中常用的默认方法
3.1. Predicate 函数式接口中的默认方法
and方法,我们在使用Predicate接口时候可能需要进行判断条件的拼接,而and方法相当于时使用&&逻辑运算符拼接这两个判断条件。
如打印作家中年龄大于 17 并且姓名的长度大于 1 的作家
相当于由于对两个 Predicate 函数式接口的 test 方法的返回结果再进行逻辑与运算。
negate方法:相当于对我们的test的结果进行取反操作。
比如返回作家年龄不大于 17 的:
or方法:由于对两个Predicate函数式接口的test方法的返回结果再进行逻辑或运算。
3.2. Consumer 函数式接口中的默认方法
addThen 方法:相当于我们执行了 accept 方法之后。可以紧接着执行下一个。
如分别输出作家的年龄和姓名:
3.3. Function 函数式接口中的默认方法
andThen方法:看关键代码after.apply(apply(t))也就是说,先执行第一次apply()的处理,再执行之后的处理after.apply(),第二次的计算结果是在第一次计算结果基础上进行运算。
如获取作家出版的书籍数量:
compose方法:看关键代码apply(before.appy(v)),可以看出与andThen方法刚好相反。
4. 总结
我们在实现函数式接口的具体抽象方法时,不一定使用匿名内部类的方式,也可以使用 lambda 表达式,或者方法引用。