参考资料:Java 8 新特性—函数式接口 - 死磕 Java
概念
函数式接口是一个只有一个抽象方法的接口,最开始的时候也叫做 SAM 类型的接口(Single Abstract Method)。它具有两个特点:
- 只包含一个抽象方法:函数式接口只能有一个抽象方法,但可以包含多个默认方法或静态方法。
- 用@FunctionalInterface注解标记:该注解不强制,但通常会使用它来标记该接口为函数式接口。这样做可以让编译器检查接口是否符合函数式接口的定义,以避免不必要的错误。
Java 引入函数式接口的主要目的是支持函数式编程范式,也就是 Lambda 表达式。在 Java 中,“一切皆对象”是不可违背的宗旨,所以 Lambda 表达式是对象,而不是函数,他们必须要依附于一类特别的对象类型:函数式接口。
所以,从本质上来说 Lambda 表达式就是一个函数式接口的实例。这就是 Lambda 表达式和函数式接口的关系。简单理解就是只要一个对象是函数式接口的实例,那么该对象就可以用 Lambda 表达式来表示。
Java8之前的
其实在 Java 8 之前就已经有了大量的函数式接口,比如Runnable、Callable、Comparator等。
Consumer (消费型)
Consumer 代表这一个接受一个输入参数并且不返回任何结果的操作。它包含一个抽象方法 accept(T t),该方法接受一个参数 t,并对该参数执行某种操作。
由于 Consumer 接口中包含的抽象方法不返回结果,所以它通常用于对对象进行一些操作,如修改、输出、打印等。
Consumer<String> consumer = str -> System.out.println(str);
consumer.accept("consumer test");
组合调用
Consumer 接口中还有一个默认方法 andThen(),该方法接受一个 Consumer 实例对象 after,它允许我们将两个 Consumer 对象组合在一起,形成一个新的 Consumer 对象。

Function (函数型)
Function 代表一个接受一个输入参数并且产生一个输出结果的函数。
它包含一个抽象方法 R apply(T t),该方法接受一个参数 t(类型为 T),并返回一个结果(类型为 R),我们可以理解为根据一个数据类型 T ,经过一系列的操作后得到类型 R。
Function 接口是非常通用的,应该是他们四个当中使用最为广泛的。
- 用途一:函数转换
Function可以用于将一个类型的值转换为另一个类型的值。它可以用于各种转换操作,如类型转换、数据映射等。
- 用途二:数据处理
Function 可用于对输入数据进行处理并生成输出结果。它可以用于执行各种操作,如过滤、计算、提取、格式化等。
组合调用
Function 也提供了一些默认方法用于函数的组合:
- andThen(Function after) 方法链式调用: 接受一个 Function 作为参数,并返回一个新的 Function,该新函数首先应用当前函数,然后将结果传递给参数函数。这种方法链的方式可以用于将多个函数组合在一起,以执行一系列操作。

- compose(Function before):与 andThen()相反,它首先应用参数函数,然后再应用当前函数,这种可能更加好理解些,常用于一些顺序执行。
identity(恒等函数)
identity()的作用就是 获取一个直接返回入参的函数,等价于形如t -> t。一看感觉没啥用处,其实它在某些场景大有用处,例如:
- 作为默认函数,可以作为函数组合链中的起点或默认函数。
- 保持一致性,在某些情况下,我们可能需要一个函数,但不需要对输入进行任何操作。使用 identity() 可以确保函数的签名(输入和输出类型)与其他函数一致。
Supplier (供给型)
Supplier 是一个代表生产(或供应)某种结果的接口,它不接受任何参数,但能够提供一个结果。它定义了一个 get() 的抽象方法,用于获取结果。
Supplier<LocalDate> supplier = () -> LocalDate.now();
LocalDate localDate = supplier.get();
Supplier 接口通常用于惰性求值,只有在需要结果的时候才会执行get()。这对于延迟计算和性能优化非常有用。它也是是一个泛型接口,它可以返回不同类型的结果。
Predicate (断言型)
它接受一个输入参数并返回一个布尔值,用于表示某个条件是否满足。抽象方法为 test(),通常用于对集合中的元素进行筛选、过滤或判断。
Predicate<String> predicate = str -> str.length() > 10;
boolean result = predicate.test("www.baidu.com");
组合调用
- and(Predicate other): 返回一个新的 Predicate,表示两个 Predicate的与操作。
- or(Predicate other): 返回一个新的 Predicate,表示两个 Predicate 的或操作。
- negate(): 表示当前 Predicate 的逻辑非操作。
其他拓展接口
除了上面四个常用的函数式接口外,java.util.function 包下面还定义了很多函数式接口:
| 接口 | 说明 |
| BiConsumer<T,U> | 表示接受两个不同类型的参数,但不返回任何结果的操作 |
| BiFunction<T,U,R> | 表示接受两个不同类型的参数,并返回一个其它类型的结果的操作 |
| BinaryOperator | 表示接受两个相同类型的参数,并返回一个同一类型的结果的操作 |
| BiPredicate<T,U> | 表示接受两个不同诶行的参数,且返回布尔类型的结果的操作 |
| BooleanSupplier | 不接受任何参数,且返回一个布尔类型的结果的操作 |
| DoubleBinaryOperator | 表示接受两个double类型的参数,并返回double类型结果的操作 |
| DoubleConsumer | 表示接受一个double类型的参数,但不返回任何结果的操作 |
| DoubleFunction | 表示接受一个double类型的参数,且返回一个R类型的结果的操作 |
| DoublePredicate | 表示一个接受两个double类型的参数,且返回一个布尔类型的结果的操作 |
| DoubleSupplier | 表示一个不接受任何参数,但返回布尔类型的结果的操作 |
| DoubleToIntFunction | 表示接受两个double类型的参数,但返回一个int类型的结果的操作 |
| DoubleToLongFunction | 表示接受两个double类型的参数,但返回一个long类型的结果的操作 |
| DoubleUnaryOperator | 表示接受一个double类型的参数,且返回一个double类型的结果的操作 |
| IntBinaryOperator | 表示一个接受两个int类型的参数,且返回一个int类型的结果的操作 |
| IntConsumer | 表示接受一个int类型的参数,但不返回任何结果的操作 |
| IntFunction | 表示接受一个int类型的参数,但返回一个R类型的结果的操作 |
| IntPredicate | 表示接受一个int类型的参数,但返回布尔类型的结果的操作 |
| IntSupplier | 表示不接受任何参数,但返回一个int类型的结果的操作 |
| IntToDoubleFunction | 表示接受一个int类型的参数,但返回一个double类型的结果的操作 |
| IntToLongFunction | 表示接受一个int类型的参数,但返回一个long类型的结果的操作 |
| IntUnaryOperator | 表示接受一个int类型的参数,且返回一个int类型的结果的操作 |
| LongBinaryOperator | 表示接受两个long类型的参数,且返回一个long类型的结果的操作 |
| LongConsumer | 表示不接受任何参数,但返回一个long类型的结果的操作 |
| LongFunction | 表示接受一个loing类型的参数,但返回一个R类型的结果的操作 |
| LongPredicate | 表示接受一个long类型的参数,但返回布尔类型的结果的操作 |
| LongSupplier | 表示不接受任何参数,但返回一个long类型的结果的操作 |
| LongToDoubleFunction | 表示接受一个long类型的参数,但返回一个double类型的结果的函数 |
| LongToIntFunction | 表示接受一个long类型的参数,但返回int类型的结果的函数 |
| LongUnaryOperator | 表示接受一个long类型的参数,并返回一个long类型的结果的操作 |
| ObjDoubleConsumer | 表示接受两个参数,一个为T类型的对象,另一个double类型,但不返回任何结果的操作 |
| ObjIntConsumer | 表示接受两个参数,一个为T类型的对象,另一个int类型,但不返回任何结果的操作 |
| ObjLongConsumer | 表示接受两个参数,一个为T类型的对象,另一个double类型,但不返回任何结果的操作 |
| ToDoubleBiFunction<T,U> | 表示接受两个不同类型的参数,但返回一个double类型的结果的操作 |
| ToDoubleFunction | 表示一个接受指定类型T的参数,并返回一个double类型的结果的操作 |
| ToIntBiFunction<T,U> | 表示接受两个不同类型的参数,但返回一个int类型的结果的操作 |
| ToIntFunction | 表示一个接受指定类型T的参数,并返回一个int类型的结果的操作 |
| ToLongBiFunction<T,U> | 表示接受两个不同类型的参数,但返回一个long类型的结果的操作 |
| ToLongFunction | 表示一个接受指定类型的参数,并返回一个long类型的结果的操作 |
| UnaryOperator | 表示接受一个参数,并返回一个与参数类型相同的结果的操作 |
&spm=1001.2101.3001.5002&articleId=143594496&d=1&t=3&u=258be3742ca1443c917c6f3a8ca0871e)
1570

被折叠的 条评论
为什么被折叠?



