02:常见的函数式接口
Jdk8提供的函数式接口都在java.util.function包下,Jdk8的函数式类型的接口都有@FunctionInterface注解所标注,但实际上即使没有该注解标注的有且只有一个抽象方法的接口,都可以算是函数式接口。
在JDK8中内置的四大核心函数式接口如下:
函数式接口 | 接口类型 | 参数类型 | 返回类型 | 作用 | Stream流中的应用场景 |
---|---|---|---|---|---|
Consumer<T> | 消费型接口 | T | void | 对类型为T的对象进行操作,包含方法为accpet(T t) | 如forEach、peek等方法的函数式接口都是Consumer类型 |
Supplier<T> | 供给型接口 | 无 | T | 返回类型为T的对象,包含方法为T get() | 如collect等方法的某些方法重载就是用的Supplier类型 |
Function<T,R> | 函数型接口 | T | R | 对类型为T的对象进行操作,返回结果为 R类型的对象,包含方法为R apply(T t) | 如map,flatMap等方法的函数式接口都是Function类型 |
Predicate<T> | 断言型接口 | T | boolean | 确定类型为T的对象是否满足约束,并返回约束结果,包含方法为boolean test(T t) | 如filter等方法的函数式接口都是Predicate类型 |
Consumer<T>
Consumer<T>消费型接口,顾名思义就是消费并处理参数,且不反馈调用环境
基本使用
public class Main { /** * Consumer<T> * 消费型接口:顾名思义主要用于消费参数,不反馈调用环境(没有返回值) * accept: 抽象方法实现,用于调用方法。 * andThen: 默认实现方法,内部允许我们链式调用 */ public static void main(String[] args) { // 给定字符串转为大写并输出到控制台,匿名内部类的方式实现 Consumer<String> con1 = new Consumer<String>() { @Override public void accept(String str) { System.out.println("通过匿名内部类的方式:"+ str.toUpperCase()); } }; // 执行该方法的时候,我们传入了给定参数字符串,它会去执行我们上述实现的accept方法并传入参数,最后执行我们给定的代码逻辑 con1.accept("abc"); // 给定字符串转为大写并输出到控制台,通过Lambda表达式实现 Consumer<String> con2 = (text)-> System.out.println("通过Lambda表达式的方式:"+ text.toUpperCase()); con2.accept("goods"); /** * 最终结果: * 通过匿名内部类的方式:ABC * 通过Lambda表达式的方式:GOOD * 使用lambda表达式,我们只需要记住参数列表和执行逻辑即可,其他的我们无需关注。 */ }}