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表达式,我们只需要记住参数列表和执行逻辑即可,其他的我们无需关注。
*/
}}


